coefont cloudのサンプルレート
coefontでダウンロードした音声ファイルを、soxで結合しようとしたが、エラーが出てしまい、つまずいてしまったので、そのメモです。
Input files must have the same sample-rate
というエラーが出ている状況
soxで結合するコマンドは、
sox ivr*.wav output.wav
でいけるはずだが、エラーが、Input files must have the same sample-rate と出てしまい進まない。
エラー理由がちゃんと書いているけど、なぜ一緒にダウンロードした音声ファイルのサンプルレートが違うのか、よく分からない。coefontは書き出しする毎に、最適なサンプルレートを選択するのかな。
結合する前に、サンプルレートを合わせないといけない。AsteriskのIVRで使用するので、8000にすればいい話だけど、一つ一つ、サンプルレートを変更するのもな。
まずは、現在のサンプルレートを確認する
soxi ivr1.wav
とすると、
Input File : 'ivr1.wav'
Channels : 1
Sample Rate : 24000
Precision : 16-bit
Duration : 00:00:02.20 = 52800 samples ~ 165 CDDA sectors
Sample Encoding: 16-bit Signed Integer PC
と表示される。一つ一つ確認するのも面倒なので、コマンドを作る
for file in ivr*.wav; do soxi “$file”; done
とした。
Input File : 'ivr1.wav'
Channels : 1
Sample Rate : 24000
Precision : 16-bit
Duration : 00:00:02.20 = 52800 samples ~ 165 CDDA sectors
Sample Encoding: 16-bit Signed Integer PCM
Input File : 'ivr2.wav'
Channels : 1
Sample Rate : 24000
Precision : 16-bit
Duration : 00:00:04.76 = 114300 samples ~ 357.188 CDDA sectors
Sample Encoding: 16-bit Signed Integer PCM
Input File : 'ivr3.wav'
Channels : 1
Sample Rate : 44100
Precision : 16-bit
Duration : 00:00:05.24 = 230975 samples = 392.815 CDDA sectors
Sample Encoding: 16-bit Signed Integer PCM
Input File : 'ivr4.wav'
Channels : 1
Sample Rate : 44100
Precision : 16-bit
Duration : 00:00:04.10 = 180810 samples = 307.5 CDDA sectors
Sample Encoding: 16-bit Signed Integer PCM
Input File : 'ivr6.wav'
Channels : 1
Sample Rate : 24000
Precision : 16-bit
Duration : 00:00:04.86 = 116700 samples ~ 364.688 CDDA sectors
Sample Encoding: 16-bit Signed Integer PCM
Input File : 'ivr7.wav'
Channels : 1
Sample Rate : 24000
Precision : 16-bit
Duration : 00:00:04.86 = 116700 samples ~ 364.688 CDDA sectors
Sample Encoding: 16-bit Signed Integer PCM
Input File : 'ivr8.wav'
Channels : 1
Sample Rate : 24000
Precision : 16-bit
Duration : 00:00:01.86 = 44700 samples ~ 139.688 CDDA sectors
Sample Encoding: 16-bit Signed Integer PCM
Input File : 'ivr9.wav'
Channels : 1
Sample Rate : 24000
Precision : 16-bit
Duration : 00:00:03.48 = 83400 samples ~ 260.625 CDDA sectors
Sample Encoding: 16-bit Signed Integer PCM
そうすると、Sample Rate : 24000と44100が混在していることが分かった。結合でエラーが出た原因が明確化された。保存時に、サンプルレートが変わる点はcoefontさんに聞くしかない。coefontからのダウンロード時に結合することも出来るんだけど、別々で必要に応じて結合するのが、利便性が良い。
サンプルレートの変換
サンプルレートは、どちらかに合わせても良いけど、最終的には8000にするから、ここでやってしまう。
sox ivr1.wav -r 8000 output.wav
で行ける。ここで、また一括処理をするコマンドを作る。
for file in ivr*.wav; do sox “$file” -r 8000 “$file”; done
とした。しかし、これは失敗。同じファイル名に保存できないのかも。ファイルが壊れたので、Linuxへのダウンロードからやり直し。
for file in ivr*.wav; do sox “$file” -r 8000 out”$file”; done
として、別名のファイルに保存した。
音声ファイルの結合
sox outivr*.wav output.wav
はい、これでエラーも出ずに、書き出しが終わった。
あとは、Asteriskで使用する形式に変換していく
以前のここの記事でも行っていたので、見ながら進める
wavからu-lawに変更する。
8000Hz,1チャンネルで(無指定だと失敗する)
sox output.wav -r 8000 -c 1 -t ul output.ulaw
サンプルレートが8000だと、音質が悪いね。これは、ulawのコーデックを使用している為の制限。
そろそろ、もう少しいいコーデックでの接続もしていかなければな。研究の余地有り。