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

2023-12-24 17:08

本文主要是介绍centos下espeak文本转语音的代码实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 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源文件和其他人的博客总结出来的,有些地方我也不是很清楚,希望能对需要的人提供参考!

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




















这篇关于centos下espeak文本转语音的代码实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/532487

相关文章

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU