0

我有一个应用程序,它使用 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。

4

1 回答 1

0

我找到了一个解决这个问题的方法,它不能解释为什么之前语音会失败,但确实可以使语音听起来像预期的那样。实际上,代码现在读起来也好一点。

而不是AUDIO_OUTPUT_PLAYBACK用于异步播放,然后通过等待语音完成espeak_SynchronizeAUDIO_OUTPUT_SYNCH_PLAYBACK用于同步播放并删除最终调用(它没有伤害,但不再需要。)

于 2014-02-03T20:22:30.113 回答