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
arm, Embedded, flite, Linux
Boa 是一套小型的網頁伺服器,很適合應用在 Embedded System 上,並且內建就可以直接支援以 C 寫的 CGI 網頁,這篇是移植 Boa 到 ARM9 S3C2410 平台的過程,Linux 版本為 2.6.17.4,使用 arm-linux toolchain 3.4.1 編譯。
1. 產生 Makefile
下載 Source code 並解壓縮進到 src 目錄。
# ./configure --host=arm-linux
2. 修改 Makefile 使用跨平台編譯
CC = arm-linux-gcc
CPP = arm-linux-gcc -E
# make (如果編譯或執行時有錯誤請看Q&A)
# arm-linux-strip boa
3. 配置 Boa
可以在源碼目錄找到這個設定檔,放到 /etc/boa 裡面,有修改的部份如下:
User 0
Group 0
#DirectoryMaker /usr/lib/boa/boa_indexer
CGIPath /bin:/usr/bin:/var/www/cgi-bin
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
然後需要放一個 mime.types 檔案在 /etc,我是直接複製 ubuntu 裡的檔案。
4. 加入 boa 執行檔
將編譯好的 boa 執行檔加入檔案系統 /bin,要啟動 server 只要輸入 boa 即可,可到 /var/log/boa 查看 log。
問題 Q&A:
Read more...
Embedded, Linux, Server
boa, Embedded, Linux, Server
在 Linux 系統中的時鐘,可分為硬體時鐘及系統時鐘。硬體時鐘可以依賴輔助電源(電池)持續累計時間;而系統時鐘則每次重新啟動就會重置,所以一般 Linux 在開機時會做個和硬體時鐘同步的動作(hwclock -s),但是在 Embedded Linux 中是要手動操作的。
首先必須正確驅動 S3C2410 的 RTC(Real-Time Clock) 模組才能使用 hwclock 指令,Linux 2.6.10 版本之後應該都有內建驅動,不過在 2.6.14.7 版本中有些問題,會跑出 Segmentation fault 訊息,需要作以下修改。
1. 重新編譯 Kernel 選項
# make menuconfig
在 Device Drivers ---> Character devices --->
< > Enhanced Real Time Clock Support (不要選擇)
[*] S3C2410 RTC Driver
2. 修改 arch/arm/mach-s3c2410/mach-smdk2410.c
在 struct platform_device *smdk2410_devices[] 當中加入 &s3c_device_rtc,,這個結構已經在 arch/arm/mach-s3c2410/devs.c 定義,應該是忘記加了,修改好後再編譯即完成。
3. 確認驅動載入
Driver 有正確載入開機應該會有
S3C2410 RTC, (c) 2004 Simtec Electronics
s3c2410-rtc s3c2410-rtc: rtc disabled, re-enabling
並且有 /dev/misc/rtc 裝置
4. 使用 hwclock
先利用 date 指令調整好系統時間,再用 hwclock -w 寫入硬體時鐘,往後開機只要自動執行用 hwclock -s 即可抓到正確的時間囉!
Embedded, Linux
Embedded, Linux
基本需求:
- 可連上 GPRS 的硬體設備
- 編譯 Kernel 使其支援 PPP
- 擁有 pppd、chat 兩個程式
- PPP 連線的 script 檔案
1. 可連上 GPRS 的硬體設備
可以是專用的 GPRS Modem 或是手機,不過當然要先配置好相關設定及驅動,我是使用 Wavecom Q2403A 這個 GSM/GPRS 模組透過 com port 來實驗。
2. 編譯 Kernel 使其支援 PPP
# make menuconfig
選擇 Device Drivers ---> Network device support ---> PPP (point-to-point protocol) support,底下的子項目如果不確定就全選即可。
核心更新後請檢查 /dev/ppp 是否存在,若無可用 mknod /dev/ppp c 108 0 建立。
3. 擁有 pppd、chat 兩個程式
如果是一般 PC 版本應該都已經有內建了;Embedded 平台則可以考慮使用 busybox,裡面也有包含這兩個程式;再不然就自行下載 source code 來編譯。
4. PPP 連線的 script 檔案
建立 script 來做 PPP 連線,通常可以在 /usr/share/doc/ppp/examples/scripts 底下找到 ppp-on、ppp-off、ppp-on-dialer 三個範例檔案,不過用範例檔的設定不一定能成功,請參考我的檔案,已測試中華電信可以成功。
相關的設定及原理可以參考:
Embedded, Linux, 系統筆記
Embedded, GPRS, internet, Linux, PPP
平台資訊:
核心板:Samsung S3C2410 ARM920T
無線網卡:PCI GW-US54GXS
Linux Kernel:2.6.14.7
Cross Compile:arm-linux-gcc 3.4.1
PCI 所推出的無線網卡大多採用 ZB1211(B) 的晶片,算是滿普遍的一種,所以相容性還不錯,成功移植機率比較大。先到官方下載好網卡的 Linux Driver。
1. 解壓縮檔案
tar zxvf GW-US54GXS_Linux_v2.15.0.0_CE.tar.gz
2. 修改 Makefile
# Cross Compile
CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc
CPP=/usr/local/arm/3.4.1/bin/arm-linux-g++
LD=/usr/local/arm/3.4.1/bin/arm-linux-ld
----------------------------------------------------------------------------
# 修改 Kernel Source 所在路徑
KERN_26=y
KERNEL_SOURCE=/opt/linux-2.6.14.7
----------------------------------------------------------------------------
# 修改 MOD_PATH
MODPATH=/opt/linux-2.6.14.7/Modules_install/lib/modules/2.6.14.7
----------------------------------------------------------------------------
# 修改 KDIR
KDIR :=/opt/linux-2.6.14.7/Modules_install/lib/modules/2.6.14.7/build
----------------------------------------------------------------------------
存檔離開
3. 開始編譯
make ZD1211REV_B=1
4. 完成
沒錯誤就會得到 zd1211b.ko,將它加入檔案系統並用 insmod 載入即可。
延伸閱讀
Embedded
Embedded, Linux, porting, wireless
近期迴響