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(音標)等更多功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章