sox用法

asterisk 的語音預設是可撥放底下的檔案格式
gsm: raw gsm encoding, good for VoIP gsm 音檔格式,適合用於 VoIP
wav: MS wav format, 16 bit linear
WAV: MS wav format, gsm encoded (wav49)

wav 的格式雖常見,但是細分卻有很多不同的規格,換句話說就是很多格式都叫成 wav 檔了。而且 asterisk 要撥放的 wav 格式有嚴格的要求,非它指定的格式則不能撥放。所以我們要用 sox 這個指令來轉檔成 asterisk 能撥放的格式。

PS:在 audacity裡wav格式選擇 WAV(Microsoft) signed 16bit PCM 8000Hz,儲存時不可以有任何的標簽訊息,否則 asterisk 所支援無法撥放。

底下就開始介紹 sox 的用法
sox 在debian系統裡預設沒裝,得另外下指令安裝
[cmd]指令:
sudo aptitude install sox libsox-fmt-mp3
[/cmd]
說明:sox預設也不支援mp3解碼,因此要額外安裝 libsox-fmt-mp3 此套件後才能支援mp3解碼

注意: sox 不同的版本參數不同(變化很大),舊版參數與新版參數無法混用,這裡只介紹新版 SoX v14.3.0 的用法

soxi 檔名.mp3
看此音檔的詳細資料
舊版的sox指令則要這樣下 sox –i 檔名.mp3

sox 原始檔案.mp3 -r 8k -c1 輸出檔案.wav
上面這行指令要注意的是參數所下的位置,原始檔案前面不要下任何參數,參數要下在輸出檔案.wav前
sox -r 8k -c 1 原始檔案.mp3 輸出檔案.wav
若們上面這樣將參數全下在檔名前面,則輸出檔案.wav 無法轉成你要的 8k rate 和單聲道
若還想要使檔案更小,可加此參數 -b8
sox 原始檔案.mp3 -r 8k -b8 -c1 輸出檔案.wav
但要注意,有些 asterisk 版本並不支援這樣的格式,所以得改成下面這樣
sox 原始檔案.mp3 -r 8k -b16 -c1 輸出檔案.wav
大量轉檔,一行指令搞定:

for list in *.mp3; do sox "$list" -r 8k -c1 `echo $list|sed "s/.mp3/.wav/"`; done


轉 sln 格式
sox foo-in.wav -t raw -r 8000 -s -2 -c 1 foo-out.sln
若你在同一個資料夾底下有一堆 wav 檔,可用以下指令,一起轉檔
If you have a directory full of .wav files to convert, try this command. It uses sed to automatically rename the files with the .sln extension (assuming incoming wav files at a sample rate other than 8khz.)

指令:

for a in *.wav; do sox "$a" -t raw -r 8000 -s -w -c 1 `echo $a|sed "s/.wav/.sln/"` resample -ql; done


轉 gsm 格式
轉wav to gsm 比你想像的簡單
Converting your WAV files to good GSM files is easier than you might think if you have the program Sox installed (on Debian systems the libsox-fmt-gsm package is required in addition to sox). From the shell prompt, enter this command:

指令:
sox foo.wav -r 8000 foo.gsm resample -ql
vic註:新版的 sox 似乎已不支援 resample ,所以此指令無法直接執行, resample 可能得改用 rate 或是直接拿掉 resample 參數

Note: sox 參數 ‘-ql’ (是小寫的 L) modifies the resample option. It is not a number one (1).

若你的 wav 檔是立體聲,請加此參數 -c1 否則輸出的檔聽起來會怪怪的
If your WAV file was in stereo, add the -c1 option to convert to mono, or the output will sound very strange.

所以建議指令如下:
舊版指令: (在新版resample 已不適用)
sox foo.wav -r 8000 -c1 foo.gsm resample -ql
新版指令:(esample 已拿掉)
sox foo.wav -r 8k -c1 foo.gsm

You may get better results if you record your WAV file in 16 bit 8000 Hz mono and then run

sox foo.wav foo.gsm

轉 wav 格式

sox foo-in.wav -r 8k -c 1 -s -w foo-out.wav
sox foo-in.wav -r 8k -c 1 foo-out.wav

若要撥放 gsm 檔可用以下指令

play -t wav hello-world.wav
play -t raw -r 8k -e a-law hello-world.pcm
play -t gsm hello-world.gsm

[tip]
play 指令,是包含在 sox 套件裡的,預設ubuntu系統沒有安裝,你可以下此指令安裝 sudo aptitude install sox
[/tip]

[note]參考資料:voip-info清風博客音頻處理領域的瑞士軍刀、[/note]

分類: voip。這篇內容的永久連結

在〈sox用法〉中有 1 則留言

  1. liveM表示:

    请问可以把 .sln 重新转换成 .wav 的吗?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *