C++ 菲利特元';t从文件/festvox存储库加载语音

C++ 菲利特元';t从文件/festvox存储库加载语音,c++,text-to-speech,flite,C++,Text To Speech,Flite,我仍然为FLite TTS惹上麻烦。在将它构建到我的项目(Ubuntu 16.04上的c++)中之后,我无法加载任何语音来执行TTS转换。我尝试了三种方法来初始化所需的声音,但运气不佳 起初,我尝试从docs示例中“register_cmu_us_kal”,但它有许多构建错误,甚至无法编译,因为它找不到一些内部使用的函数 后来尝试了“flite_voice_select”,结果在运行时出现崩溃(然后发现没有返回语音,因为语音列表是空的,我应该填充它吗?init方法不应该这样做吗?) 最后,我厌倦

我仍然为FLite TTS惹上麻烦。在将它构建到我的项目(Ubuntu 16.04上的c++)中之后,我无法加载任何语音来执行TTS转换。我尝试了三种方法来初始化所需的声音,但运气不佳

起初,我尝试从docs示例中“register_cmu_us_kal”,但它有许多构建错误,甚至无法编译,因为它找不到一些内部使用的函数

后来尝试了“flite_voice_select”,结果在运行时出现崩溃(然后发现没有返回语音,因为语音列表是空的,我应该填充它吗?init方法不应该这样做吗?)

最后,我厌倦了“flite_voice_load”,并得到了一些出错的提示,但它并没有引起我的注意

使用“flite\u voice\u 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;
    
}

与ALX23z的胡说八道相反,这里有一个解决方案(也许实际上阅读文档并尝试实现一个解决方案会更有帮助):

extern“C”{
cst_语音*寄存器_cmu_us_rms(const char*voxdir);
无效注销cmu us rms(cst_voice*v);
void usenglish_init(cst_voice*v);
cst_词典*cmulex_初始(无效);
}
布尔
TTSFliteManager::TTSTRNSLATE(标准::字符串文本,标准::字符串目标)
{

AddiLogLogyDebug从一个URL而不是本地文件尝试加载文件。这是不可能的。你需要支持它,它不是C++和许多其他库和语言的原生。我也尝试过本地文件,看到上面的注释行,我做了其他一些测试和研究,这里只报告了主要的。cs状态:语音也可以从文件动态加载,也可以内置。-voice选项的参数可能是转储(Clustergen)语音的路径名。这可能是Unix路径名或URL(仅支持“http”和“文件”协议。例如flite-voicefile://cmu_us_awb.flitevox -f doc/alice-o alice.wav flite-voice-f doc/alice-o alice.wavcont。我希望它能自己完成,而不是依赖我为无法控制的内部调用提供功能。如果我需要包括其他库,请请告诉我哪一个好
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
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",usenglish_init,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;
}