问题描述
我仍然对FLite TTS感到困扰。将其构建到我的项目中(在Ubuntu 16.04上为c ++)后,我无法加载任何声音来执行TTS转换。我尝试了三种方法来初始化需要的声音而没有运气。
起初,我尝试了docs示例中的“ register_cmu_us_kal”,但是它带有许多构建错误,甚至由于无法找到一些内部使用的函数而无法编译。
后来尝试“ flite_voice_select”只是为了在运行时崩溃(然后发现没有声音返回,因为声音列表为空,我应该填充它吗?init方法不应该这样做吗?)
最后,我对“ flite_voice_load”感到厌倦,并得到了一些提示,指出了出了什么问题,但是并没有崩溃。
使用“ flite_voice_load”调用,我得到以下结果:
2020-09-08T12:54:55.099821 DEBUG TTSFliteManager::TTSTranslate()
Error load voice: lang/lex eng not supported in this binary
2020-09-08T12:55:01.588762 DEBUG TTSFliteManager::TTSTranslate() voice list = 0
2020-09-08T12:55:01.588814 ERROR TTSFliteManager::TTSTranslate() NO VOICE SELECTED 0
如果我做对了,它会找到voice.flitevox文件,但是缺少其他内容,语言?词典?我不知道,因为我只使用FLtie本身提供的声音,所以我认为做得很好。 查看函数签名,我的理解是,直到加载了语音,我才能使用“ flite_add_voice”或“ flite_add_lang”,所以我还缺少什么其他指令来将语音文件实际加载到应用中以完成转换?
extern "C" {
cst_voice *register_cmu_us_kal(const char*);
}
...
bool
TTSFliteManager::TTSTranslate(std::string text,std::string destination)
{
ADD_LOG_DEBUG << "TTSFliteManager::TTSTranslate()";
cst_voice *voice;
flite_init();
// std::string voiceName = "file:///home/user/download/cmu_us_aew.flitevox";
std::string voiceName = "http://festvox.org/flite/packed/flite-2.0/voices/cmu_us_rxr.flitevox";
voice = flite_voice_load(voiceName.c_str());
// voice = flite_voice_select(voiceName.c_str());
// voice = register_cmu_us_kal(NULL);
ADD_LOG_DEBUG << "TTSFliteManager::TTSTranslate() voice list = " << flite_voice_list ;
if(voice == nullptr)
{
ADD_LOG_ERROR << "TTSFliteManager::TTSTranslate() NO VOICE SELECTED " << voice;
return false;
}
ADD_LOG_DEBUG << "TTSFliteManager::TTSTranslate() ready to convert text '" << text.c_str() << "' to destination '" << destination.c_str() << "' with voice '" << voice << "'";
float secs = flite_text_to_speech(text.c_str(),voice,destination.c_str());
if (secs == 0)
{
ADD_LOG_ERROR << "TTSFliteManager::TTSTranslate() ERROR GENERATED AUdio FILE IS EMPTY";
return false;
}
return true;
}
令我特别困惑和沮丧的是,在命令行中它可以完美地工作,因此实际上它就在那里,只是看不到它。以下命令生成了一个完全可听的文件:
flite -voice file:///home/user/download/cmu_us_aew.flitevox -f /home/user/download/flite-2.0.0-release/doc/intro.txt -o intro.wav
解决方法
与ALX23z的废话相反,这是一个解决方案(也许实际上是阅读文档并尝试实现一个解决方案会更有帮助):
extern "C" {
cst_voice *register_cmu_us_rms(const char *voxdir);
void unregister_cmu_us_rms(cst_voice *v);
void usenglish_init(cst_voice *v);
cst_lexicon *cmulex_init(void);
}
bool
TTSFliteManager::TTSTranslate(std::string text,std::string destination)
{
ADD_LOG_DEBUG << "TTSFliteManager::TTSTranslate()";
cst_voice *voice;
flite_init();
std::string voiceName = "/home/user/download/cmu_us_rms.flitevox";
// std::string voiceName = "http://festvox.org/flite/packed/flite-2.0/voices/cmu_us_rms.flitevox";
flite_add_lang("eng",usenglish_init,cmulex_init);
flite_add_lang("usenglish",cmulex_init);
voice = flite_voice_load(voiceName.c_str());
if(voice == nullptr)
{
ADD_LOG_ERROR << "TTSFliteManager::TTSTranslate() NO VOICE SELECTED " << voice;
return false;
}
ADD_LOG_DEBUG << "TTSFliteManager::TTSTranslate() ready to convert text '" << text.c_str() << "' to destination '" << destination.c_str() << "' with voice '" << voice << "'";
float secs = flite_text_to_speech(text.c_str(),voice,destination.c_str());
if (secs == 0)
{
ADD_LOG_ERROR << "TTSFliteManager::TTSTranslate() ERROR GENERATED AUDIO FILE IS EMPTY";
return false;
}
return true;
}
请注意,它完全适用于本地文件和远程文件,只需取消注释第二个“ std :: string voiceName”(并删除第一个)声明,以使该库从在线存储库下载语音,我就去了本地文件是出于明显的性能原因。