消息结束时发音额外的音节
libespeak voicing extra syllables at end of message
我有一个应用程序,该应用程序使用libespeak(版本1.47.11)以类似人类的语音宣布各种状态消息。
这效果很好,直到将新线程引入应用程序为止。现在,通常,预期的单词之后是胡言乱语。有时,这些是更长的,先前宣布的消息的最后一个音节。其他时候它们是数字或只是流浪字母。
我的代码类似于:
#include <espeak/speak_lib.h>
// ...
std::string message = "The rain in Spain falls mainly in the plain.";
espeak_Initialize(
AUDIO_OUTPUT_PLAYBACK, // plays audio data asynchronously
500, // length of buffers for synth function, in ms
nullptr, // dir containing espeak-data, or null for default
0); // options are mostly for phoneme callbacks, so 0
espeak_ERROR err = espeak_Synth(
message.c_str(), // text
message.size(), // size
0, // position to start from
POS_CHARACTER, // whether above 0 pos is chars/word/sentences
message.size(), // end position, 0 indicating no end
espeakCHARS_AUTO | // flags: AUTO 8 bit or UTF8 automatically
espeakENDPAUSE, // ENDPAUSE sentence pause at end of text
nullptr, // message identifier given to callback (unused)
nullptr); // user data, passed to the callback function (unused)
if (err != EE_OK)
cerr << "Error synthesising speech" << endl;
// Wait until everything has been spoken
espeak_Synchronize();
我尝试分配一个大的零缓冲区并将其弦复制到libespeak之前,但它没有帮助。
这些调用的范围一直是对espeak_Synchronize
块的调用,直到语音完成为止,因此没有删除message
字符串。好像libespeak忽略了我要的长度。
请注意,如果我缩短size
参数(第二个参数),则截断了口语。
也请注意,我只在我的多线程应用程序中从一个线程调用libespeak。
我找到了一个解决这个问题的解决方案,该解决方案无法解释为什么语音以前失败,而是会按预期表达语音。实际上,代码现在也读取了好一点。
而不是使用AUDIO_OUTPUT_PLAYBACK
进行异步播放,然后等待通过espeak_Synchronize
完成语音,而是使用AUDIO_OUTPUT_SYNCH_PLAYBACK
进行同步播放并删除最终呼叫(不再需要,但不再需要。)
相关文章:
- boost::进程间消息队列引发错误
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 为什么在这个代码结束循环中没有得到结束
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 试图对缓存进行跨步测试,但程序并没有结束
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- 为什么擦除方法会影响结束方法
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- ROS2 动态消息模板
- C++秘密消息学校作业
- glad 导致 glfwSwapBuffers 返回错误消息
- C++,术语,非规范,阻塞,检测消息结束
- 客户端发送消息,但服务器在客户端结束程序之前不接收消息
- 消息结束时发音额外的音节
- 加密++异常调用消息结束
- While循环永不结束消息