Archive

Posts Tagged ‘flite’

移植 Flite 到 ARM 平台

九月 21st, 2007

Flite (Festival-Lite) 是一套 TTS(Text To Speech) 系統,透過語音合成技術,不需要錄一堆龐大的語音資料庫就可以朗讀文句。Flite 顧名思義就是有名的 Festival 重寫精簡版,更適合應用在嵌入式系統上,編譯完的執行檔只有 2.5MB 左右,也由於是使用 C 寫的,所以可以很容易和自己的程式結合,試了半天總算可以在 2410 Arm Linux 上面跑起來了。

1. 跨平台編譯
編譯方式和大多數 Open Source 差不多。
# ./configure CC=arm-linux-gcc --host=arm-linux
# make
# arm-linux-strip bin/flite

完成就會得到 flite 執行檔,下載到板子測試:
# flite -t "Hello, How are you?"
嗯,沒有聲音,只有第一次出現 0.x 秒的雜音,再試試:
# flite "Hello, How are you?" test.wav
會將語音存成 test.wav,抓到 PC 上播放,很正常。所以猜想應該是放音部份的問題。

2. 修改 src/audio/au_oss.c
覺得這一段怪怪的,因為記得 S3C2410 採用的 UDA1341 音效晶片只有 Ch1 和 Ch2
if (ad->channels == 0)
ad->channels = 1;
改成
if (ad->channels == 1)
ad->channels = 2;
重新編譯後再測試,有了,有聲音出來了,不過速度太快了,根本聽不清楚再唸什麼,所以要再改一下。

3. 修改 lang/cmu_us_kal/cmu_us_kal.c
/* Intonation */
feat_set_float(v->features,"int_f0_target_mean",95.0); //音色
feat_set_float(v->features,"int_f0_target_stddev",11.0); //音調
feat_set_float(v->features,"duration_stretch",1.1); //速度
前兩個互相搭配可以調整出不同的聲音,實際測試結果發現在 ARM 平台及 PC 上播放會差滿多的,PC 上照預設值就很好聽,ARM 則是調整到下面這樣才比較能接受。
/* Intonation */
feat_set_float(v->features,"int_f0_target_mean",167.0); //音色
feat_set_float(v->features,"int_f0_target_stddev",65.0); //音調
feat_set_float(v->features,"duration_stretch",2.5); //速度

英文 TTS 差不多都已經滿純熟了,中文 TTS 不少業界或實驗室也都有不錯成果,不過都是要付費居多,如果是 Windows 則有微軟的 Speech SDK 可以使用。
另外有找到 SD178A 這顆 IC,應該是個不錯的東西。

Embedded , , ,