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

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景