消息结束时发音额外的音节

libespeak voicing extra syllables at end of message

本文关键字:消息 结束      更新时间:2023-10-16

我有一个应用程序,该应用程序使用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进行同步播放并删除最终呼叫(不再需要,但不再需要。)