libespeak озвучивает дополнительные слоги в конце сообщения

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 блоков до тех пор, пока речь не завершится, поэтому ничто не espeak_Synchronize строку message. Как будто libespeak игнорирует длину, которую я запрашиваю.

Обратите внимание, что если я сокращаю аргумент size (второй), то устная строка усекается.

Также обратите внимание, что я вызываю libespeak только из одного потока в моем многопоточном приложении.

Теги:
espeak

1 ответ

0
Лучший ответ

Я нашел решение этой проблемы, которая не объясняет, почему речь шла раньше, но делает речевой звук, как ожидалось. И на самом деле код читает немного лучше сейчас.

Вместо использования AUDIO_OUTPUT_PLAYBACK для асинхронного воспроизведения, а затем ожидания окончания речи через espeak_Synchronize, используйте AUDIO_OUTPUT_SYNCH_PLAYBACK для синхронного воспроизведения и удалите последний вызов (это не повредит, но больше не требуется).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню