九月21

移植 Flite 到 ARM 平台

tags , , , | No Comments | 1,677 views

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,應該是個不錯的東西。


九月18

在嵌入式 Linux 架設 Boa Webserver

tags , , , | No Comments | 4,173 views

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:
Continue reading! »


九月18

S3C2410 RTC Driver 問題

tags , | No Comments | 2,108 views

在 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 即可抓到正確的時間囉!

九月9

Windows Live Messenger 8.5 手動去廣告

tags , , | No Comments | 3,197 views

Windows Live Messenger 8.5 beta(還是習慣叫 MSN)中文版已經在前幾天發佈囉!可以不用再到處找英文版+中文化了,這次除了 Messenger 主程式外,還加進了幾個 Windows Live 系列的軟體,可以說是一個集合工具包,大家可以試用看看,不過我最後只留下 Messenger、Mail、Writer 個人覺得比較好用的。

當然每次新版出現都會找去廣告、多重開啟的程式,Google 一下發現有太多版本了,可能因為 beta 的關係,版本號有一大堆,也不確定能不能用,最後還是決定手動修改比較安心實在,原本的修改方式在 8.5 也是通用的。

詳細修改方法請參考這篇「Windows Live Messenger 修改筆記」。

底下是我修改好的 Patch 檔,適用於 8.5.1288.816 中文版本

  • 多重開啟
  • 移除主視窗廣告
  • 移除搜尋列
  • 移除底部文字廣告
  • 增加個人訊息文字至 500 個字元

檔案下載

九月9

Linux 自動配置主設備號

tags , , | No Comments | 1,260 views

在撰寫 Linux 設備驅動程式的時候,如果指定主設備號(MAJOR)為 0,就可以利用 alloc_chrdev_region() 函式讓系統自動分配一個可用 MAJOR 給裝置,程式片段:

#define DEV_NAME "LED" //設備名稱
int DEV_MAJOR = 0; //主設備號
int DEV_MINOR = 0; //次設備號
int count = 1;
dev_t led_dev;
/*  Dynamic assign major */
result = alloc_chrdev_region(&led_dev, DEV_MAJOR, count, DEV_NAME);
DEV_MAJOR = MAJOR(led_dev);

這樣驅動寫好後載入核心執行,就會分配到一個 MAJOR,可利用 cat /proc/devices 查看,但是如果要存取這個設備,還需要手動用 mknod 在 /dev 建立設備檔,但問題是怎麼知道分配到的設備號碼是什麼?這裡利用一個 shell script 搭配 awk 來達成。

#!/bin/sh
module = "LED" // /proc/device 顯示的名稱
device = "LED" // /dev 要建立的設備檔名稱
 
major=`cat /proc/devices | awk "\\$2==\"$module\" {print \\$1}"`
mknod /dev/$device c $major 0 //建立字元設備

然後只要將這個 script 檔案設成啟動時執行就可以囉!