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

相关文章

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Java Kafka消费者实现过程

《JavaKafka消费者实现过程》Kafka消费者通过KafkaConsumer类实现,核心机制包括偏移量管理、消费者组协调、批量拉取消息及多线程处理,手动提交offset确保数据可靠性,自动提交... 目录基础KafkaConsumer类分析关键代码与核心算法2.1 订阅与分区分配2.2 拉取消息2.3

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装