如果找不到合适的示例,则必须阅读头文件中的文档。没用过,但看起来很容易理解:
http://espeak.sourceforge.net/speak_lib.h
当你打电话时,espeak_Initialize
你传入了 AUDIO_OUTPUT_PLAYBACK。您将需要改为传入 AUDIO_OUTPUT_RETRIEVAL,然后看起来您必须espeak_SetSynthCallback
使用自己创建的函数调用才能接受样本。
您修改后的代码看起来像这样(未测试):
#include <string.h>
#include <vector>
#include </usr/local/include/espeak/speak_lib.h>
int samplerate; // determined by espeak, will be in Hertz (Hz)
const int buflength = 200; // passed to espeak, in milliseconds (ms)
std::vector<short> sounddata;
int SynthCallback(short *wav, int numsamples, espeak_EVENT *events) {
if (wav == NULL)
return 1; // NULL means done.
/* process your samples here, let's just gather them */
sounddata.insert(sounddata.end(), wav, wav + numsamples);
return 0; // 0 continues synthesis, 1 aborts
}
int main(int argc, char* argv[] ) {
char text[] = {"الله لطيف "};
samplerate = espeak_Initialize(AUDIO_OUTPUT_RETRIEVAL, buflength, NULL, 0);
espeak_SetSynthCallback(&SynthCallback);
espeak_SetVoiceByName("ar");
unsigned int flags=espeakCHARS_AUTO | espeakENDPAUSE;
size_t size = strlen(text);
espeak_Synth(text, size + 1, 0, POS_CHARACTER, 0, flags, NULL, NULL);
espeak_Synchronize();
/* in theory sounddata holds your samples now... */
return 0;
}
所以对于你的问题:
返回生成的波形以将其存储在变量中的函数-您编写一个回调函数,该函数获取buflength
要处理的 wav 的小长位。如果您要将数据累积到更大的缓冲区中,我已经展示了您如何自己做到这一点。
频率- 通过这个 API,它看起来不像是你选择的,espeak 是。它以 Hz 为单位并按samplerate
上述方式返回。
通道数- 没有提到它,并且语音合成通常是单声道的,人们会认为。(默认情况下,人声在大多数立体声混音中是混合中心的……所以你会拿回你得到的单声道数据并在左右声道上播放相同的合成数据。)
样本量- 你得到short
s。这些是有符号整数,2 个字节,范围为 -32,768 到 32,767。可能它使用了整个范围,似乎不可配置,但您可以测试并查看您得到的结果。
我们存储样本的缓冲区 - 合成缓冲区似乎属于 espeak,它处理它的分配和释放。我已经展示了一个使用 std::vector 从多个调用中收集块的示例。
样本数量- 每次致电您的SynthCallback
客户都会获得可能不同数量的样本。您可能会得到该数字的 0,但这可能并不意味着它已经结束。