初识语音合成软件eSpeak

原创 2018年04月16日 22:54:36

    在医院取药时听到机器叫自己的名字,有点小好奇。应该是使用了文本转语音技术。出于好奇,百度了一下,发现了这个开源软件eSpeak。下载windows安装包,测试了一下,发现微软的语音技术非常成熟,语音流畅清晰,相比下,eSpeak的语音不太流畅,英语要努力才能听,中文效果离实用距离很远。不管怎样,eSpeak是可以工作的,我作为一个小猿,可以把它组装到自己程序中的跑一跑,不是一件有趣的事情吗?
      说干就干,这其中还是有坑的。我用svn检出了eSpeak的最新代码。我主要使用了其中的两个vc6工程,一个用来生成动态库,一个用来生成命令行程序。先说命令行程序,它居然不使用动态库,说明作者的思路不寻常。它依赖一个叫PAStaticWMME.lib的静态库。该库是另一开源软件PortAudio生成的。我在编译PortAudio时一直没有成功。于是决定直接使用PAStaticWMME.lib。我在vc2005下编译命令行程序报错缺少libc.lib,它是vc6的c语言运行时库。于是从网上下载了一个libcd.lib,将它改名为libc.lib也可以使用。再编译时报很多函数重复定义,于是将libc.lib添加到忽略库中,编译通过。命令行程序可以对标准输入中的文本进行语音合成后发音。再说动态库工程,直接编译生成的动态库是没有语音播放功能的。如果需要,则要先修改speech.h文件,将被注释的#define USE_PORTAUDIO放开。编译时需要依赖PAStaticWMME.lib。编译成功后得到espeak_lib.dll和espeak_lib.lib。头文件espeak_lib.h中对每个函数都有注释,有比没有强吧。我在我的QT工程中添加外部库espeak_lib.lib。在对话框构造函数中增加espeak初始化语句,如下。
static int SynthCallback(short *wav, int numsamples, espeak_EVENT *events)
{
    // 你可以根据源码程序里编写这部分代码实现生成语音文件功能,这里忽略掉了
    return(0);
}
// espeak初始化
    int ret = espeak_Initialize(AUDIO_OUTPUT_SYNCH_PLAYBACK, 0, "C:\\Program Files (x86)\\eSpeak", 0);
    if (ret == EE_INTERNAL_ERROR)
    {
        qDebug() << tr("espeak_Initialize fail");
        return;
    }
    qDebug() << tr("espeak_Initialize ok, return") << ret;
    espeak_SetSynthCallback(SynthCallback);   // 设置回调函数
    ret = espeak_SetParameter(espeakRATE, 80, 0); // 语速调慢至每分钟80个字
    if (ret == EE_INTERNAL_ERROR)
    {
        qDebug() << tr("espeak_SetParameter fail");
        return;
    }
    qDebug() << tr("espeak_SetParameter ok");
espeak_Initialize函数的第3个参数是 espeak-data目录。安装espeak的windows安装包后就有该目录。回调函数SynthCallback什么也不做,直接返回0。在播放语音按钮的处理函数中增加以下语句,实现了英文语音合成播放功能。
    espeak_SetVoiceByName("en"); // 使用英语语音
    ret = espeak_Synth(strCode.toUtf8().data(), strlen(strCode.toUtf8().data()),
                       0, POS_CHARACTER, 0, espeakCHARS_UTF8, NULL ,NULL);
    if (ret != EE_OK)
    {
        qDebug() << tr("espeak_Synth error:") << ret;
        return;
    }
    espeak_Synchronize();

eSpeak: Linux 文本转语音工具

eSpeak是一款 Linux 命令行工具,能把文本转换成语音。它是一款简洁的语音合成器,用C语言编写而成,它支持英语和其它多种语言。 eSpeak 从标准输入或者输入文件中读取文本。虽然语音输出与...
  • mandagod
  • mandagod
  • 2016-01-03 22:12:46
  • 3038

树莓派添加中文语音合成功能

怎样给树莓派添加中文语音合成功能 首先,在树莓派里下载中文语音合成软件Ekho的Linux版。 然后,根据安装说明进行安装。关键的一句是makeCXXFLAGS=-DNO_SSE 再...
  • bona020
  • bona020
  • 2016-07-01 02:26:08
  • 1368

Java文本语音转换组件JTTS发布(eSpeak封装)

众所周知,所谓TTS即Text To Speech的英文缩写,也就是“从文本转换到语音”。 TTS技术的主要作用在于利用计算机合成人语,并将文字信息转化为语音信息进行播放。简单点说,TTS技术赋予了计...
  • wangshuxuncom
  • wangshuxuncom
  • 2014-03-25 15:24:50
  • 4497

3个开源TTS(三)flite的简要分析与espeak的选择

这篇主要介绍下flite和在windows下的cygwin中编译,以及选择espeak的原因。     从flite的介绍中可以看到,它是festival-lite,即festival的精简版,相对...
  • wangshuxuncom
  • wangshuxuncom
  • 2014-03-31 09:52:39
  • 4093

espeak源码语言技术

  • 2014年09月12日 13:59
  • 6.31MB
  • 下载

树莓派文本转化为语音

原文地址:http://elinux.org/RPi_Text_to_Speech_(Speech_Synthesis)
  • oGuWen1
  • oGuWen1
  • 2014-03-07 12:03:37
  • 1154

eSpeak TTS 中英文真人发音引擎

eSpeak TTS 中英文真人发音引擎 Tcl/Tk 扩展与 eSpeak API 示例。转载时请注明出处:http://www.tcltk.cn      这几天看残奥会真的是大受感动。现场有那么...
  • tjh666
  • tjh666
  • 2009-03-12 10:09:00
  • 8537

Linux下Festival离线语音合成

最近研究了下Linux下的语音合成,一般用的就是 espeak festival ekho 科大讯飞 其中espeak最古老,但是我的Ubuntu简单安装又没安装上,所以没研究,ekho我听...
  • adzcsx2
  • adzcsx2
  • 2016-12-23 11:04:56
  • 1840

3个开源TTS(二)eSpeak的简要分析使用

继续开源TTS分析,只能说是给刚起步的人一点帮助了,毕竟不是专业做这一块的。今天主要先简单介绍TTS过程,然后以eSpeak的动态库编译使用,获得wav文件结束。     前文介绍eSpeak是c语...
  • wangshuxuncom
  • wangshuxuncom
  • 2014-03-31 09:49:01
  • 5153

Linux中文朗读软件--espeak

可识别多语言的朗读软件
  • derryzhang
  • derryzhang
  • 2010-07-27 16:24:00
  • 9665
收藏助手
不良信息举报
您举报文章:初识语音合成软件eSpeak
举报原因:
原因补充:

(最多只允许输入30个字)