1、espeak简单的介绍
espeak是一款能朗读文本的软件,其最主要的特色是即能读汉语又能英语,体积很小就2M左右,比较其他tts软件,如festival、ekho等,安装起来要简单的多,也容易上手,提供c++接口及库,使用起来非常方便,函数调用简单。但是发音不是很好听,读速设置太快容易听不清楚,与festival,ekho的真人发音还有较大的差距。但是它能支持多语言发音,能读英文和汉语,粤语。比festival不能读汉语,和ekho不能读英语来说又好点。
2、首先安装只需两个命令就ok了,yum search espeak搜索可安装的espeak版本 ,yum install espeak.xxx对应的版本
3、代码实现与分析
#include<espeak/speak_lib.h> //包含 speak_lib.h 头文件 如果不再默认路径,用find / -name speak_lib.h找到其所在的路径用#include"path/speak_lib.h"包含进来
#include<stdio.h>
#include<string.h>
#include<unistd.h>
//FILE* f_wav=NULL;
int i=0;
int MySynthCallback(short *wav, int numsamples, espeak_EVENT *events);//回调函数
int main(int argc, char**argv)
{
char buf[128]="hello,world,也就是说子网范围扩大,那么根据子网寻径规则";
// f_wav=fopen("test.wav","wb");
espeak_Initialize(AUDIO_OUTPUT_PLAYBACK ,0,NULL,0);//初始化
espeak_SetSynthCallback(MySynthCallback);//设置回调函数
espeak_SetVoiceByName("zh");//设置音源为中文男声
espeak_SetParameter(espeakRATE,120,0);//设置语速
espeak_SetParameter(espeakVOLUME,60,0);//设置音量
espeak_SetParameter(espeakPITCH,60,0);//设置音高 espeak_Synth(buf,sizeof(buf)+1,
0,POS_CHARACTER,0,espeakCHARS_UTF8,NULL,NULL);//将文本合成语音 espeak_Synchronize();//等待直到播放完毕
espeak_Terminate();//回收资源
//fclose(f_wav);
return 0;
}
int MySynthCallback(short *wav, int numsamples, espeak_EVENT *events)
{
// 可以将wav的数据保存到文件,这里就不实现了 printf("%d\n",i++);//打印回调次数
returned 0;
}编译:g++ main.cpp -o run -lespeak
函数分析:
int espeak_Initialize(espeak_AUDIO_OUTPUT output, int buflength, const char *path, int options);
初始化函数,必须在其它任何espeak_xxx函数被调用前。
output:
设置音数据输出方式,共4中方式
AUDIO_OUTPUT_PLAYBACK,播放音频资料,给回调函数提供事件
AUDIO_OUTPUT_RETRIEVAL,提供音频数据 ,给回调提供事件,
AUDIO_OUTPUT_SYNCHRONOUS,提供音频数据,给回调函数提供事件,语音合成完成后才返回
AUDIO_OUTPUT_SYNCH_PLAYBACK,同步播放音频
Buflength:传递给回调函数的声音缓冲区长度,ms
path:包含espeak-data目录的路径,或者NULL表示默认位置
Options:bit 0: 1=allow espeakEVENT_PHONEME events.
Returns:返回采样率,hz 或-1(EE_INTERNAL_ERROR);
Void espeak_SetSynthCallback(t_espeak_callback* SynthCallback);
回调函数类型为:
int SynthCallback(short *wav, int numsamples, espeak_EVENT *events);
Wav是产生的语音数据,
Numsamples是进入wav的数量
Events是espeak_EVENT事件
返回0则继续合成语音
espeak_SetSynthCallback(MySynthCallback);//设置回调函数
必须在任语音何合成函数前调用,每当产生一个语音时候自动调用MySynthCallback函数
可以在回调函数里把产生的音频数据写入文件(初始化函数第一个参数为
AUDIO_OUTPUT_RETRIEVAL或AUDIO_OUTPUT_SYNCHRONOUS才提供音频数据
)
espeak_ERROR espeak_SetVoiceByName(const char *name);//设置发音源
espeak_SetVoiceByName("zh");//设置发音源类型为中文男
可选参数:
英文男:”en”, 女:“en+f2”
中文男:“zh” ,女:”zh+f2”
粤语男:”zhy”, 女:”zhy+f2”
espeak_ERROR espeak_SetParameter(espeak_PARAMETER parameter, int value, int relative);
//设置指定参数的值,
parameter:参数类型
value:参数的值
relative: 等于0,表示设置为绝对值;等于1, 表示设置为相对值
espeak_PARAMETER为枚类型:
typedef enum {
espeakSILENCE=0, /* internal use */
espeakRATE=1, //说话的速度每分钟在字(词)。
espeakVOLUME=2, //音量范围0 - 100 0 =沉默
espeakPITCH=3,//基本音高,,范围0 - 100。50 =正常
espeakRANGE=4,//音高范围,范围0 - 100。0-monotone 50 =正常
espeakPUNCTUATION=5, //那个标识符被宣布,value in espeak_PUNCT_TYPE
(none, all, some), 查看espeak_GetParameter()指定了那个字符被宣布
espeakCAPITALS=6,// 0=none,1=sound icon, 2=spelling, 3 or higher
espeakWORDGAP=7,//单词之间的停顿,单位10 ms(默认)
espeakOPTIONS=8, // reserved for misc. options. not yet used
espeakINTONATION=9,
espeakRESERVED1=10,
espeakRESERVED2=11,
espeakEMPHASIS, /* internal use */
espeakLINELENGTH, /* internal use */
espeakVOICETYPE, // internal, 1=mbrola
N_SPEECH_PARAM /* last enum */
} espeak_PARAMETER;
espeak_ERROR espeak_Synth(const void *text,
size_t size,
unsigned int position,
espeak_POSITION_TYPE position_type,
unsigned int end_position,
unsigned int flags,
unsigned int* unique_identifier,
void* user_data);//语音合成函数,将文字生成语音
Text:被转化为语音的数据,为8bit的characters,wchar_t,utf8 encoding的数据类型
Size:等于或大于text的字节大小(bytes),用于申请内存,注意一定要足够大,不然只能合成
Position:text中发音开始位置,0表示从text的开始位置
position_type:确定位置是否是一些words,character或(语句)
end_position:如果设置了表示停止位置,0表示没有停止位置
Flags:字符编码类型,espeakCHARS_UTF8、espeakCHARS_8BIT、
默认espeakCHARS_AUTO(8 bit or UTF8)、espeakCHARS_WCHAR、
espeakSSML、espeakPHONEMES(音位,音素 编码类型)、espeakENDPAUSE
unique_identifier:消息标识符;有助于识别,数据提供的回调函数
user_data:将被传递给回调函数的指针
返回:EE_OK.....
espeak_ERROR espeak_Synchronize(void);
//等待播放结束
espeak_ERROR espeak_Terminate(void);
//最后被调用的函数,
int espeak_IsPlaying(void);
返回1表示正在播放,0其它
void espeak_SetPhonemeTrace(int value, FILE *stream);
设置输出的音素的符号文本 ,将产生的音频数据输出到流stream,可以利用此函数生成.wav文件
value=0 No phoneme output (default)不写入文本
value=1 Output the translated phoneme symbols for the text
输出翻译的音素符号到文本,不能播放
value=2 as (1), but also output a trace of how the translation was done (matching rules and list entries)
输出翻译的音素符号到文本,而且输出了翻译是如何做的跟踪((匹配规则和列表条目) ,即可以播放