ekho--TTS语音引擎

ekho的安装和使用

ekho由国人所创,现在到6.5版本,一个TTS引擎,TTS引擎只是将相应的文本转化为语音而已,并不能跨语种翻译的。

Ekho(余音)是一个免费、开源的中文语音合成软件。它目前支持粤语、普通话(国语)、诏安客语、藏语、雅言(中国古代通用语)和韩语(试验中),英文则通过Festival间接实现。Ekho支持Linux、Windows和Android平台。


安装

Ubuntu的可以用个人源下载,版本为6.0,不过没安装config.h等,编程就难了,当然可以用system()调用解决,可能慢了点。

sudo add-apt-repository ppa:hgneng/ekho
sudo apt-get update
sudo apt-get -y install ekho

当然下载后也可以从源码编译安装,源码包下有个test_ekho可以先听听粤语版的sample。

sudo apt-get install libsndfile1-dev libpulse-dev libncurses5-dev libestools2.1-dev festival-dev libmp3lame-dev
tar xJvf ekho-xxx.tar.xz
cd ekho-xxx
./configure 
make
sudo make instal

注意官网上的编译安装时./configure加上了--enable-festival,后期编译代码时就需要安装festival才能成功,不然会出现

libekho.a(libekho_a-libekho.o):在函数‘ekho::Ekho::initFestival()’中:
/home/wang/SoftWave/ekho-6.5/src/libekho.cpp:251:对‘festival_initialize(int, int)’未定义的引用
/home/wang/SoftWave/ekho-6.5/src/libekho.cpp:256:对‘strintern(char const*)’未定义的引用
/home/wang/SoftWave/ekho-6.5/src/libekho.cpp:256:对‘siod_set_lval(char const*, obj*)’未定义的引用
……….

就是困在这N久,mark。

安装以后

‘Cantonese’, ‘Mandarin’, ‘Hakka’, ‘Tibetan’, ‘Ngangien’ and ‘Hangul’ are available now.

其中Cantonese(粤语)、Mandarin(普通话)、Ngangien(元朝前古汉语@_@)、Hakka(客家语)倒是能翻译普通话,Tibetan(藏语),Hangul(朝鲜语)就不行不行。默认是Mandarin,遗憾的是普通话下不能朗读字母,要Festival的支持才行。一开始用英文测试,还以为没安装成功。

ekho "普通话" #默认是普通话
ekho -v Cantonese "煲冬瓜" #用粤语说
ekho -t ogg -o output.ogg "123" # -o目的文件名, -t 文件类型(wav 或 ogg)

恩,字音比较清晰,不过稍欠流畅,但是可以调整。


编程

编码的话,还是下载源码安装比较好,同时一定要在ekho的文件夹里创建例子和编译,因为config.h在这。

/* file try.cpp */   
#include "config.h" 
#include "ekho.h"   
using namespace ekho; 
int main(int argc, char **argv)
{
   Ekho wong("Cantonese"); //粤语
   wong.setSpeed(30); //语速接近正常,虽然还是...
   wong.blockSpeak("我要一步一步往上爬"); //转换为语音的文本
   return 0;
 }

编译

 g++ try.cpp libekho.a -pthread   -I. -Iutfcpp/source -Isonic -lsndfile   `pkg-config --libs libpulse-simple` `pkg-config --cflags libpulse-simple`

粤语标配是男生,国语标配是女生,音质挺好的。

试过跟着官网编译链接,不成功

g++ try.cpp libekho.a \ lib/libSoundTouch.a lib/libFestival.a lib/libestools.a \ lib/libeststring.a lib/libestbase.a \ -I. -Iutfcpp/source -Isonic -pthread \ -lvorbisenc -lvorbis -lm -logg -lmp3lame -lsndfile -lncurses \ `pkg-config --libs libpulse-simple` \ `pkg-config --cflags libpulse-simple`  

g++: error: lib/libSoundTouch.a: 没有那个文件或目录
g++: error: lib/libFestival.a: 没有那个文件或目录
g++: error: lib/libestools.a: 没有那个文件或目录
g++: error: lib/libeststring.a: 没有那个文件或目录
g++: error: lib/libestbase.a: 没有那个文件或目录

因在6.5中lib分成32位(lib32)和64位(lib64),部分*.a是分开放的,我的是32位,修改下(6.3的版本还只是分liblib64的),而且也没有libSoundTouch.a文件。

看回Ekho,,参考ekho.h,常用到的操作有

      Ekho();
      Ekho(string voice); //voice为语言
      ~Ekho();

      /* 设置语言,如粤语、国语、韩语,分别为Cantonese, Mandarin, Korean */
      int setVoice(string voice); 
      string getVoice(void);

      /* 设置转换语音的文本,新建另一线程播放 */
      int speak(string text, void (*pCallback)(void*) = NULL, void* pCallbackArgs = NULL); 

      /* 清空原有,新建另一线程播放 */
      int stopAndSpeak(string text, void (*pCallback)(void*) = NULL, void* pCallbackArgs = NULL);

      /* 播放语音,不允许暂停 */
      int blockSpeak(string text);

      /* 播放音频 */
      int play(string file);

      /* 保存文本转换后的语音文件 */
      int saveWav(string text, string filename);
      int saveOgg(string text, string filename);
      int saveMp3(string text, string filename);

      /* 对语音的操作 */
      int pause(void);
      int resume(void);
      int stop(void);

      /* 设置音速 (百分比下-50到100)   */
      void setSpeed(int tempo_delta);
      int getSpeed(void);

      /* 设置音调,范围为 (-100 .. 100) */
      void setPitch(int pitch_delta);
      int getPitch(void);

      /* 设置音量,范围为 (-100 .. 100) */
      void setVolume(int volume_delta);
      int getVolume(void);

      /* 设置音速 (-50 .. 100, in percent) */
      void setRate(int rate_delta);
      int getRate(void);

      /* 检测是否播放中 */
      bool isSpeaking();

      string genTempFilename(void);

还有Synth、TTS服务器端、SSML、Pcm缓存、sonicStream、Punctuation(音标)等更多功能。

你可能感兴趣的:(TTS)