我正在尝试使用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;
}

因此,对于您的问题:
  • 返回生成的wave并将其存储在变量中的函数-您编写了一个回调函数,该函数几乎不处理wav的buflength -long位。如果您打算将数据累积到更大的缓冲区中,那么我已经展示了如何自己做到这一点。
  • 频率-通过此API,看起来好像不是您选择的,espeak确实如此。它以Hz为单位,并作为上面的samplerate返回。
  • 通道数-没有人提及,语音合成通常是单声道,有人会想到。 (默认情况下,大多数立体声混音中的人声都是混合中音...因此,您将获取返回的单声道数据,并在左右声道上播放相同的合成数据。)
  • 样本大小-您获得short。这些是带符号的整数(2个字节),范围为-32,768至32,767。可能它使用了整个范围,似乎不是可配置的,但是您可以测试一下,看看得出什么。
  • 用于存储样本的缓冲区-合成缓冲区似乎属于espeak,它负责分配和释放它。我展示了一个使用std::vector从多个调用中收集块的示例。
  • 样本数-每次调用SynthCallback都会获得不同数量的样本。您可能会为该数字获得0,但这并不意味着它在末尾。
  • 关于c++ - 讲功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37250305/

    10-11 18:13