Espeak 功能
Espeak Functionality
我正在尝试使用 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]!='[=10=]') 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.Fuction 其中 return 生成的 wave 将其存储在变量中
2.Frequency
3.number 个频道
4.sample 尺寸
5.a 我们存储样本的缓冲区
6.number 个样本
如果你找不到合适的例子,你将不得不阅读头文件中的文档。没用过,但看起来很容易理解:
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;
}
所以对于你的问题:
return 将生成的 wave 存储在变量中的函数 - 你写了一个回调函数,那个函数变得很少 buflength
- 要处理的 wav 的长位。如果您打算将数据累积到更大的缓冲区中,我已经展示了您如何自己做。
Frequency - 通过这个 API 看起来不像是你选择的,espeak 确实如此。它以赫兹为单位,return编辑为上面的 samplerate
。
通道数 - 没有提到它,人们会认为语音合成通常是单声道。 (在大多数立体声混音中,默认情况下人声混合在中心...因此您可以获取返回的单声道数据并在左右声道上播放相同的合成数据。)
样本量 - 你得到 short
s。这些是带符号的整数,2 个字节,范围为 -32,768 到 32,767。可能它使用了整个范围,似乎不可配置,但你可以测试看看你得到了什么。
我们存储样本的缓冲区 - 合成缓冲区似乎属于 espeak,它处理它的分配和释放。我已经展示了一个使用 std::vector 从多个调用中收集块的示例。
样本数量 - 每次调用您的 SynthCallback
都会获得可能不同数量的样本。您可能会得到该数字的 0,这可能并不意味着它在末尾。
我正在尝试使用 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]!='[=10=]') 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.Fuction 其中 return 生成的 wave 将其存储在变量中
2.Frequency
3.number 个频道
4.sample 尺寸
5.a 我们存储样本的缓冲区
6.number 个样本
如果你找不到合适的例子,你将不得不阅读头文件中的文档。没用过,但看起来很容易理解:
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;
}
所以对于你的问题:
return 将生成的 wave 存储在变量中的函数 - 你写了一个回调函数,那个函数变得很少
buflength
- 要处理的 wav 的长位。如果您打算将数据累积到更大的缓冲区中,我已经展示了您如何自己做。Frequency - 通过这个 API 看起来不像是你选择的,espeak 确实如此。它以赫兹为单位,return编辑为上面的
samplerate
。通道数 - 没有提到它,人们会认为语音合成通常是单声道。 (在大多数立体声混音中,默认情况下人声混合在中心...因此您可以获取返回的单声道数据并在左右声道上播放相同的合成数据。)
样本量 - 你得到
short
s。这些是带符号的整数,2 个字节,范围为 -32,768 到 32,767。可能它使用了整个范围,似乎不可配置,但你可以测试看看你得到了什么。我们存储样本的缓冲区 - 合成缓冲区似乎属于 espeak,它处理它的分配和释放。我已经展示了一个使用 std::vector 从多个调用中收集块的示例。
样本数量 - 每次调用您的
SynthCallback
都会获得可能不同数量的样本。您可能会得到该数字的 0,这可能并不意味着它在末尾。