2015年8月13日 星期四

Linux下,解壓縮VOICEMITH夏語遙日語資料庫


VOICEMITH推出夏語遙的聲音資料庫,因為對語音合成還滿有興趣的,就想說載來試看看。

結果在Linux下使用unzip直接解壓縮其日與資料庫的結果,是慘烈的亂碼。

後來搜尋了部分的解決方式,在此記錄

1. 安裝7zip 解壓縮軟體
  #apt-get install p7zip-full

2. 下載VOICEMITH中的夏語遙的日語資料庫
  官方網站 : http://www.voicemith.com/download.html

3. 安裝日本字集
  #dpkg-reconfigure locales

   選擇 ja_JP.EUC-JP與ja_JP.UTF-8

4. 用7z解壓縮,這時看到會是解出滿滿的亂碼
  #LANG=C 7za x Xia_Voice_Bank_JP.zip

5. 安裝convmv,用來轉換檔案檔明的encoding
  #apt-get install convmv

6. 利用convmv轉換,因為這個日語資料庫好像是用windows的編碼字集去壓的,所以在參數設定上,原始字集要設定成Shift-JIS,而不是EUC-JP,然後選輸出成UTF8
  #convmv -f Shift-JIS -t utf8 --notest -r Xia_Voice_Bank_JP

經過以上步驟之後,在linux上應該就可以像下圖一樣顯示日文了



然後如果是在Windows上,想利用Putty連線並顯示日文(UTF8 )的話 :

開啟Putty →Window → Translation → 在Remote character set 中選UTF8即可




2014年6月4日 星期三

Android 4.2.2 , RT3070 wifi porting note [2]

Android 4.2.2 , RT3070 wifi porting note [2]

 Android version : Android 4.2.2 
Wifi module : TOTOLINK N150UM (RT3070) 

 之前提到在BBB上做了androidporting,又在上做了wifi的配置,結果忘了把過程寫出來,上半年真是太懶散了,多虧有網友提醒,我在這裡把相關的配置設定做個記錄,這裡的資料是我參考一些網路上的資料,綜合而來,希望對各方朋友能有所幫助。 

這篇Note分成2個部分: 
1. RT3070 wifi driver porting 
2. Android 4.2.2 setting 

1. RT3070 wifi driver porting時,我會簡介一下如何把RT3070的驅動程式修改程能在Android上用的版本,基本上程式碼是不太需要動到的,只是需要修改一些設定,在cross-compilerARMandroid平台上。 

2. Android 4.2.2 setting時,我會簡介一下如何修改部分的Android source,把wifi的設定匹配到我們剛剛cross-compiler driver上。

在這篇文章中有些地方也許沒辦法解釋的很清楚,因為我在這方面還是個新手,如果有地方說明錯誤,請各方朋友不吝指教。

這篇文章為
2. Android 4.2.2 setting
==================================================================================================
取得Android Source
在這裡我使用的Source,是TI-Android-JB-4.2.2-DevKit-4.1.1版本,而TI也提供了一個非常棒的porting guideDevelopment Guide,如下網址;但是這個版本似乎預設是沒有把wifi給加入編譯環境的,所以需要加一些小修改,讓Android在編譯時一同加入wifi的選項。
http://processors.wiki.ti.com/index.php/TI-Android-JB-4.2.2-DevKit-4.1.1_ReleaseNotes
基本上需要確認的以下內容:
1.         Linux kernel device driver enable
2.         修改Android對應開發版的Boardconfig.mk
3.         修改device.mk,增加wifi device
4.         修改Android初始化檔案init.am335xevm.rc
5.         更新Android overlay
6.         重新編譯Android
7.         新增wifi device驅動
8.         新增wpa_supplicant.conf檔案
9.         新增dhcpcd_wlan.conf檔案
10.    結果

這篇文章使用得是TOTOLINK N150UM (RT3070)wifi網卡,因為需要對這個wifi網卡的驅動作一些修改,詳細的修改方法請參閱:
http://vegetableavenger.blogspot.tw/2014/06/android-422-rt3070-wifi-porting-note-1.html

==================================================================================================
Linux kernel device driver enable
先確認一下,linux kernel上有沒有勾選wireless LAN相關的設定
Device Drivers  --->
       [*] Network device support  --->
           [*]   Wireless LAN --->

==================================================================================================
修改Android對應開發版的Boardconfig.mk
再確認完linux kernel之後,接著對Android source修改一些內容,首先需要修改Boardconfig.mk,這個檔案位於device/ti/beagleboneblack/BoardConfig.mk,這個檔案記錄了一些平台的資訊,由於我使用得是beaglebone black,因此便選這個平台,在這個檔案中需要新增Androidwpa_supplicant的設定,新增或修改以下內容:
BOARD_HAVE_WIFI := true
BOARD_WPA_SUPPLICANT_DRIVER     :=WEXT
WPA_SUPPLICANT_VERSION           := VER_0_8_X
BOARD_WLAN_DEVICE                := wlan0
BOARD_SOFTAP_DEVICE              := wlan0
WIFI_DRIVER_MODULE_PATH          := "/system/lib/modules/rt3070sta.ko"
WIFI_DRIVER_MODULE_NAME         := "rt3070sta"
§   BOARD_WPA_SUPPLICANT_DRIVER
在這裡使用WEXT,似乎是WPA_SUPPLICANT用來跟linux kernelwifi driver互動的driver,這我不是很清楚,需要再找找資料補充補充。
§   WPA_SUPPLICANT_VERSION
WPA_SUPPLICANT的版本,這裡使用0.8的版本。
§   BOARD_WLAN_DEVICE & BOARD_SOFTAP_DEVICE
wifi device的名字,這取決於你的wifi device註冊後的名字,因為在之前的RT3070 wifi 修改中,我已經將wifi device的名字從ra改成wlan,因此在這裡使用wlan0,作為預設的board wlan device
§   WIFI_DRIVER_MODULE_PATH
wifi driver的路徑,這取決於你的wifi driver放的地方,這個路徑要注意一下,因為/system/lib/下應該是沒有modules這個資料夾的,因此,如果你要使用這個路徑,請記得在燒錄SD卡之後,在mount,把這個資料夾創出來(往後會在提一次)
§   WIFI_DRIVER_MODULE_NAME
wifi deriver的檔名,不用加ko

==================================================================================================
修改device.mk,增加wifi device
接著需要增加wifi device的名字,這取決於你的wifi device註冊後的名字,因為在之前的RT3070 wifi 修改中,我已經將wifi device的名字從ra改成wlan,因此在這裡使用wlan0,作為預設的board wlan device

修改device/ti/beagleboneblack/device.mk這個檔案,新增或修改下內容

# BBBwifi
PRODUCT_PROPERTY_OVERRIDES += \
        wifi.interface=wlan0

請注意是使用+=,而不是:=,所以要注意新增的位置,因為PRODUCT_PROPERTY_OVERRIDES這個變量在device.mk中,可能已經做了一些設定,所以使用+=來新增新的變量,在新增這行時,要注意使用:=設定PRODUCT_PROPERTY_OVERRIDES的位置,如下圖所示,在35行行處使用:=來進行第一次的設定,因此我們新增的內容要放在這行之後(這裡放在46),否則可能會出現一些問題。



接著,在device/ti/beagleboneblack/device.mk中,新增permissions file
PRODUCT_COPY_FILES := \
{原本的內容} \
frameworks/native/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xml

注意不要把原本在PRODUCT_COPY_FILES就設定好的變量給刪掉,將原本的內容最後面加一個「\」,然後在加上上面那行,如下所示。


==================================================================================================
修改Android初始化檔案init.am335xevm.rc
Android開機時會讀取init.rc來進行一些設定,而init.rc會在針對不同的平台獨取子init.rc來進行存取,而我所使用的是beaglebone black,其子init.rc ” 位於device/ti/beagleboneblack/init.am335xevm.rc,在這個檔案中我們會:
§   新增wifi需要資料夾設定
§   install wifimodule
§   設定servicewifi使用

1.         新增wifi需要資料夾設定
找到on boot區域,新增以下內容,修改存取權限
mkdir /data/misc/wifi/sockets 0770 wifi wifi
mkdir /data/misc/dhcp 0770 dhcp dhcp
chown dhcp dhcp /data/misc/dhcp
setprop wifi.interface wlan0


2.         install wifimodule
找到on boot區域,新增以下內容,請注意路徑,這個路徑是你放wifi driver的地方。
insmod /system/lib/modules/cfg80211.ko
insmod /system/lib/modules/mac80211.ko
insmod /system/lib/modules/rt3070sta.ko

3.  修改權限 (2015/5/1新增
 再on boot區域,新增以下內容:
    chown wifi wifi 將/data/misc/wifi/wpa_supplicant.conf
    mkdir /data/system/wpa_supplicant 0770 wifi:wifi

 

video=720x480-16@60

4.         設定servicewifi使用
找到on fs區域,新增以下內容。
service wpa_supplicant /system/bin/wpa_supplicant -iwlan0 -Dwext -c/data/misc/wifi/wpa_supplicant.conf –dd
disabled
oneshot


service dhcpcd_wlan0 /system/bin/dhcpcd -ABKL  -f/system/etc/dhcpcd/dhcpcd_wlan.conf
disabled
oneshot

service iprenew_wlan0 /system/bin/dhcpcd –n
disabled
oneshot


service wpa_supplicant中,如果你的裝置不是wlan0,請修改成您的device name

請特別注意/data/misc/wifi/wpa_supplicant.conf /system/etc/dhcpcd/dhcpcd_wlan.conf路徑,以上2個路徑的檔案都是不存在的,需要自己手動新增,而新增的內容,請參閱後面的內容

==================================================================================================
更新Android overlay
接著需要更新一下androidoverlay,因為這個source預設在android settingUI中是沒有wifi介面的,因此需要新增一下overlay,請修改這個檔案device/ti/beagleboneblack/overlay/frameworks/base/core/res/res/values/config.xml,新增以下內容:

<string-array translatable="false" name="networkAttributes">
<item>"ethernet,9,9,2,-1,true"</item>
<item>"wifi,1,1,1,-1,true"</item>
</string-array>

<string-array translatable="false" name="radioAttributes">
<item>"1,1"</item>
<item>"9,1"</item>
</string-array>



==================================================================================================
重新編譯Android
接著請重新編譯Android,然後燒到SD卡中。

==================================================================================================
新增wifi device驅動
因為我們剛剛沒有把驅動加入到編譯的環境中,因此在燒入好SD卡之後,請先使用以下的指令,將Androidfile system mount起來,燒完應該會有5個分割,不一定會是sdf,請根據您的環境稍做修改,在這裡使用的是第2個分割區。

#mount –t ext4 /dev/sdf2 /mnt/fs

首先新增放kernel module的資料夾

#mkdir /mnt/fs/system/lib/modules

然後到androidkernel路徑,使用以下指令搜尋kernel module,然後將搜尋到的.ko檔全部複製到/mnt/fs/system/lib/modules/之中;
# cd {your dir}/kernel/
# find ./ -name “*.ko”
由於我使用的driver是自己重編的,因此也需要將此檔案複製過來,同時RT3070這個驅動也需要一些額外的設定檔,一並複製過去。
# cp 2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/rt3070sta.ko /mnt/fs/system/lib/modules/

# mkdir /mnt/fs/system/etc/Wireless/
# mkdir /mnt/fs/system/etc/Wireless/RT2870STA
# cp 2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/ RT2870STA.dat /mnt/fs/system/etc/Wireless/RT2870STA

==================================================================================================
新增wpa_supplicant.conf檔案
接著我們需要新增wpa_supplicant.conf這個檔案,讓wpa_supplicant能夠讀取這個檔案,請一定要新增這個檔案,否則我們在之前新增的service wpa_supplicant會無法成功運作。

而這個檔案放的位置是根據我們上面的init.am335xevm.rc中設定的service wpa_supplicant來決定,我設定是放在 /data/misc/wifi/wpa_supplicant.conf之中,接著請mount SD卡,來新增這個檔案,在這裡使用的是第3個分割區

# mount -t ext4 /dev/sdf3 /mnt/fs2/
# mkdir /mnt/fs2/misc/wifi/
# vim /mnt/fs2/misc/wifi/wpa_supplicant.conf

wpa_supplicant.conf中新增以下內容:
ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=wifi
update_config=1

==================================================================================================
新增dhcpcd_wlan.conf檔案
dhcp也需要一個設定檔,在上面的init.am335xevm.rc中,service dhcpcd_wlan0需要這個設定檔,此設定檔放在 /system/etc/dhcpcd/dhcpcd_wlan.conf之中。

# mount -t ext4 /dev/sdf2 /mnt/fs/
# vim /mnt/fs/system/etc/dhcpcd/dhcpcd_wlan.conf

dhcpcd_wlan.conf中新增以下內容:

interface wlan0
option domain_name_servers, domain_name, domain_search, host_name

==================================================================================================
結果
接著就可以把SD卡接上Beaglebone black,然後等他開機測試完成之後,到seting應該就可以看到wifi的選項已經出現了。




接著就可以來測試看看能不能正常的搜尋網路,從圖中可以看到已經能夠搜尋出附近的網路!



接著嘗試連線其中一台AP,可以看到已經能夠取得IP了,然後就可以測試看看能不能正常上網了!