centos下espeak文本转语音的代码实现

1 篇文章 0 订阅

 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表示默认位置



Optionsbit 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的数量

Eventsespeak_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),用于申请内存,注意一定要足够大,不然只能合成


Positiontext中发音开始位置,0表示从text的开始位置


position_type:确定位置是否是一些words,character或(语句)


end_position:如果设置了表示停止位置,0表示没有停止位置


Flags:字符编码类型,espeakCHARS_UTF8espeakCHARS_8BIT

默认espeakCHARS_AUTO8 bit or UTF8)、espeakCHARS_WCHAR

espeakSSMLespeakPHONEMES(音位,音素 编码类型)、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)

输出翻译音素符号到文本,而且输出了翻译是如何做的跟踪((匹配规则和列表条目) ,即可以播放

Streamoutput stream for the phoneme symbols (and trace).  If stream=NULL then it uses stdout. 

本人新手!

参考了espeak源文件和其他人的博客总结出来的,有些地方我也不是很清楚,希望能对需要的人提供参考!

如果有错误恳请大家指正!谢谢!



















  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值