首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Espeak功能

Espeak功能
EN

Stack Overflow用户
提问于 2016-05-16 09:08:22
回答 1查看 1.6K关注 0票数 1

我试着用espeak做一些功能,但是缺少一些参数(我不知道),并且在Linux上处理代码块,下一段代码运行良好,可以读取阿拉伯文本。

代码语言:javascript
复制
  `#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.Frequency

3.频道数目

4.样本量

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

6.样本数目

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-16 10:35:09

如果找不到合适的示例,则必须阅读头文件中的文档。还没有使用过它,但它看起来很容易理解:

lib.h

当你打电话给espeak_Initialize时,你通过了AUDIO_OUTPUT_PLAYBACK。您将需要传入AUDIO_OUTPUT_RETRIEVAL,然后似乎必须使用自己创建的函数调用espeak_SetSynthCallback来接受示例。

您的修改后的代码看起来会像这样(未经测试)

代码语言:javascript
复制
#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. 函数,该函数返回生成的波形以将其存储在变量中--编写回调函数,该函数将获得wav的小buflength-long位以进行处理。如果要将数据积累到一个更大的缓冲区中,我已经向您展示了如何自己进行此操作。
  2. 频率-通过这个API它看起来不像你选择它,埃斯皮恩是这样做的。它是以赫兹和返回作为samplerate以上。
  3. 频道的数量-没有提到它,而且声音合成一般是单一的,人们会认为。(在大多数立体声mixes...so中,声道是混合中心的,在大多数立体声中,你会把你得到的单声道数据放回去,并在左右频道播放相同的合成数据。)
  4. 样本大小-你得到shorts。这些是有符号整数,2个字节,范围为-32,768到32,767。可能它使用了整个范围,看起来并不是可配置的,但是您可以测试并查看您得到的结果。
  5. 我们在其中存储样本的缓冲区--合成缓冲区似乎属于es匹克,它处理分配和释放它。我展示了一个使用std::vector从多个调用中收集块的示例。
  6. 样本数--每次调用SynthCallback都会得到可能不同数量的样本。你可能会得到0的数字,这可能并不意味着它是在结尾。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37250305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档