SoX(Sound eXchange)で音声感知録音:その2

前の関連記事:SoX(Sound eXchange)でMP3を扱う


自動録音ファイルを一定の時間ごとに自動分割を行います。音声感知録音なので「一定時間」というのは音声ファイルの時間ではなくて、音声感知をしていた期間になります。

自動録音ファイルの自動分割

sox -c 1 -d -p | sox -p voice_.wav silence -l 1 00:00:00.05 -48d 1 00:00:00.5 -48d : newfile : restart
これで録音開始条件が満たされるたびにvoice_001.wavから連番のwavファイルが生成されます。

-c 1でモノラル指定、-dデフォルト音声デバイス、-pは次の「|」以降に出力を引渡す意味になります。

silence -l 1 00:00:00.05 -48d 1 00:00:00.5 -48dで-48デシベルのボリュームが0.05秒持続したら録音開始し、-48デシベル以下のボリュームが0.5秒持続したら録音停止します。

-lオプションがあるので停止時の0.5秒も録音に含まれます。

newfileで新しいwavファイルが用意されて、restartでコマンドの最初に戻ります(複数のエフェクトチェイン)。

newfileで生成されるwavファイルは拡張子の前に3桁の連番がつきました(出力ファイル)。
sox -c 1 -d -p | sox -p "%DATE:/=%_%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%_.wav"silence -l 1 00:00:00.05 -48d 1 00:00:00.5 -48d : newfile : restart
これで保存時の日時が同定できると思ったのですが、soxを最初に起動した日時のファイル名に連番がつくだけで、期待通りの結果は得られませんでした。

ちなみにこのコマンドの「年月日_時分秒_001.wav」とファイル名は0時から9時までは時刻の前に半角スペースが入ってしまいます。
for /F "tokens=1 delims=." %x in ('^(for /F "tokens=1,2,3 delims=:" %p in ^('echo %date:/=%_%time: =0%'^) do @echo %p%q%r^)') do sox -c 1 -d -p | sox -p "%x_.wav" silence -l 1 00:00:00.05 -48d 1 00:00:00.5 -48d: newfile : restart
すごく長いコマンドになりますがForコマンドを2回使うと半角スペースを0に置換するコマンドを1行に収められます。(バッチファイル:ファイル名に使える「年月日_時分秒」を1行で得る方法参照。)

「20150316_223559_001.wav」といったファイル名が得られます。
sox -c 1 -d -p | sox -p voice_.wav trim 0 10 silence -l 1 00:00:00.05 -48d 1 00:00:00.5 -48d : newfile : restart
これで(静音区間を含めた)10秒間ごとにファイルが分割されました。

静音区間は削除されていますので、生成されるファイルは静音区間の長さ分10秒よりも短くなっています。


ファイル名を最初に録音開始した日時にするにはこのようにします。
for /F "tokens=1 delims=." %x in ('^(for /F "tokens=1,2,3 delims=:" %p in ^('echo %date:/=%_%time: =0%'^) do @echo %p%q%r^)') do sox -c 1 -d -p | sox -p "%x_.wav" trim 0 10 silence -l 1 00:00:00.05 -48d 1 00:00:00.5 -48d : newfile : restart
これで自動分割したファイルの作成時間から大雑把な時刻が把握できますね。

1時間区切りで録音してファイル名でその区間がわかるようにする


音声感知録音に取り掛かったものの用途が特に思いつかずにやる気がそがれていましたが、スマホでは寝言録音アプリというカテゴリーがあると知って、ちょっとやる気がでました。

録音はauto_rec.batというバッチファイルで行います。
@echo off
path %PATH%;C:\Program Files (x86)\sox-14-4-2
set AUDIODRIVER=waveaudio
echo 終了するにはCtrl+Cを押してください。
for /F "tokens=1,2 delims=." %%x in ('^(for /F "tokens=1,2,3 delims=:" %%p in ^('echo 3600.%date:/=%_%time: =0%'^) do @echo %%p%%q%%r^)') do sox -c 1 -d -p | sox -p "%%y_%%x_.wav" trim 0 %%x silence -l 1 00:00:00.05 -48d 1 00:00:00.5 -48d : newfile : restart
3600.%date:/=%_%time: =0%」の3600の部分は録音区切りを秒数で指定しています。

バッチファイル内では環境変数を除く「%」は「%」でエスケープしないといけませんので、例えば「%x」は「%%x」としています。

これで「20150328_203141_3600_001.wav」という連番ファイルが生成されます。

auto_rec.batを起動するとCtrl+Cで止めるまでバッチファイルのあるフォルダに連番ファイルが生成されます。

2015年3月28日20時31分41秒に起動され、録音区間3600秒(つまり1時間)で分割された001番目のファイルという意味になります。

これでファイル名から計算すればどの区間の録音なのかがわかりますね。

あとは「20150328_203141_3600_004」(年月日_時分秒_区間秒_区間番号)を「区間開始日時-区間終了日時」へ変換するJScriptのスクリプトでファイル名を変更すれば録音区間がさらにわかりやすくなります。

参考にしたサイト


SoX, SoXI, soxformat マニュアルページ日本語訳
SoXのマニュアルを日本語訳されています。

次の関連記事:auto_rec_rename.jsをバッチファイルに埋め込む

PR

0 件のコメント:

コメントを投稿