gpt4 book ai didi

c++ - Espeak 功能

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:49:13 25 4
gpt4 key购买 nike

我正在尝试使用 espeak 实现一些功能,但缺少一些参数(我不知道)并在 Linux 上处理代码块下一个代码运行良好并读取阿拉伯文本

  `#include<string.h> 
#include<malloc.h>
#include</usr/local/include/espeak/speak_lib.h>
int main(int argc, char* argv[] )
{
char text[] = {"الله لطيف "};
espeak_Initialize(AUDIO_OUTPUT_PLAYBACK, 0, NULL, 0 );
espeak_SetVoiceByName("ar");
unsigned int size = 0;
while(text[size]!='\0') size++;
unsigned int flags=espeakCHARS_AUTO | espeakENDPAUSE;
espeak_Synth( text, size+1, 0,POS_CHARACTER,0, flags, NULL, NULL );
espeak_Synchronize( );
return 0;
}`

现在你能帮我们从 Espeak 中找到这些参数吗
1.返回生成的波并将其存储在变量中的函数

2.频率

3. channel 数量

4.样本大小

5.我们存储样本的缓冲区

6.样本数量

最佳答案

如果你找不到合适的例子,你将不得不阅读头文件中的文档。没用过,但看起来很容易理解:

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;
}

所以对于你的问题:

  1. 返回生成的 wave 以将其存储在变量中的函数 - 您编写了一个回调函数,并且该函数获得了很少的 buflength-long 位wav 进行处理。如果您要将数据累积到更大的缓冲区中,我已经展示了您如何自己完成。

  2. Frequency - 通过此 API,它看起来不像是您选择的,espeak 确实如此。它以赫兹为单位,并作为上面的 samplerate 返回。

  3. channel 数 - 没有提及,人们会认为语音合成通常是单声道的。 (在大多数立体声混音中,人声默认混合在中心...因此您可以获取返回的单声道数据并在左右声道上播放相同的合成数据。)

  4. 样本大小 - 您得到空头。这些是带符号的整数,2 个字节,范围为 -32,768 到 32,767。可能它使用整个范围,似乎不可配置,但您可以测试并查看您得到的结果。

  5. 我们存储样本的缓冲区 - 合成缓冲区似乎属于 espeak,它处理它的分配和释放。我展示了一个使用 std::vector 从多个调用中收集数据 block 的示例。

  6. 样本数 - 每次调用您的 SynthCallback 都会获得可能不同数量的样本。您可能会得到该数字的 0,这可能并不意味着它在末尾。

关于c++ - Espeak 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37250305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com