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的版本還只是分lib和lib64的),而且也沒有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(音標)等更多功能。