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

ラベル: ,

前の関連記事:mp3ファイルを扱えるAudacityで音声感知録音


wavファイルの引き算(波形ではなく長さの差をとる)ができるソフトを探していたところSoX(Sound eXchange)というソフトを見つけました。調べてみるとSoXは音声ファイル関連でかなりいろいろなことができるようです。

SoX(Sound eXchange)のインストール


SoX - Sound eXchange | HomePage

SoXはコマンドラインツールのせいか日本語で書いているページは少ない、、、少ないですがマニュアルを日本語化されている方がいました。

SoX, SoXI, soxformat マニュアルページ日本語訳

これはすごく助かりますね。

まずはSoXのインストール。

LinuxBeanではSynapticパッケージャで検索すると14.3.2-3がでてきたのでそれをインストールしました。

SoX - Sound eXchange - Browse /sox at SourceForge.net

Windowsはここからsox-14.4.2-win32.exeをダウンロードしてインストールしました。

Windows7 64bitでは"C:\Program Files (x86)\sox-14-4-2\sox.exe"で起動できました。

ライセンスの関係でSoXはデフォルトインストールではmp3が扱えません。

SoXの基本形はsox [入力元] [出力先]

再生 play [再生ファイル名]
録音 rec [録音ファイル名]
音声ファイル情報の表示 soxi [対象ファイル名]
Linuxで再生するときはplay、録音するときはrec、音声ファイルの情報を表示するときはsoxiのコマンドでできますが、Windows版では配布ファイルの容量節約のためこれらのコマンドは含まれていません。
再生 sox [再生ファイル名] -d
録音 sox -d [録音ファイル名]
音声ファイル情報の表示 sox --i [対象ファイル名]
これで同じことができます。
sox [入力元] [出力先]
soxの引数はこれが基本形になっており-dはファイル名の代わりにデフォルト音声デバイスを指定することで再生の場合は[入力元]を音声デバイスへ出力し、録音の場合は音声デバイスの入力を[出力先]に入れるということになります(音声の再生と記録)。

recやplayコマンドはこれらの入出力の一方の指定を省略できるということに過ぎません。

Windowsでもsox.exeをコピーしてplay.exe、rec.exe、soxi.exeと改名すればLinuxでも同じように使えます。

Windows7 64bitではAUDIODRIVER 環境変数の設定が必要


LinuxBeanでは簡単に再生、録音できたのですがWindows7 64bitではてこずりましたので経過を書いておきます。

wavファイルがあるフォルダをエクスプローラで開いてそこでShiftキーを押しながら右クリック→コマンドウィンドウをここで開く。

sox.exeへのパスを通していないのでまずパスを通します。
path %PATH%;C:\Program Files (x86)\sox-14-4-2
(このときはパスに空白があってもダブルクォーテーション""で囲わなくてもよいというか、囲うとうまくいきませんでした。)

これでこのコマンドウィンドウではsoxと打ち込むだけでsoxが使えるようになります。

C:\wav>sox 1.wav -d
sox FAIL sox: Sorry, there is no default audio device configured

これで1.wavが再生されるはずですがデフォルトオーディオデバイスがないといわれます。

オーディオデバイスについてはsoxformatに解説があります。

sox -hと打ち込んで出てくる結果のAUDIO DEVICE DRIVERSの項目にサポートされているデバイスが表示されると書いてあります。

AUDIO DEVICE DRIVERS: waveaudio

waveaudioはWindowsの音声デバイスドライバなのでSoXでは音声デバイスとしてちゃんと認識されているようです。

-dではSoXが理解してくれないのでwaveaudioであることをSoXに直接指定します。

入出力タイプの指定は-tオプションで指定します(-t, --type FILE-TYPE)。

C:\wav>sox 1.wav -t waveaudio

1.wav:

 File Size: 3.08M     Bit Rate: 1.41M
  Encoding: Signed PCM
  Channels: 2 @ 16-bit
Samplerate: 44100Hz
Replaygain: off
  Duration: 00:00:17.44

In:32.5% 00:00:05.67 [00:00:11.77] Out:250k  [      |      ]        Clip:0

これで再生されました。

再生を途中で終了させるにはキーボードでCtrl+Cと打ちます(SoX の停止)。

その他SoXを手動で停止させる操作はすべてCtrl+Cになります。

-dがwaveaudioであることをSoXに教えるのはAUDIODRIVER変数の設定でできました(音声の再生と記録)。
set AUDIODRIVER=waveaudio
これでsox 1.wav -dで再生できました。

ということでWindows7 64bitでコマンドウィンドウを立ち上げてSoXを使うときはまず以下のコマンドを実行しておくのがよいでしょう。
path %PATH%;C:\Program Files (x86)\sox-14-4-2
set AUDIODRIVER=waveaudio

録音レベルの調整


音声感知録音する前にまずは録音レベルの見方です。(実はあまり参考になりませんでした。)

単に録音レベルだけ観測するときは出力先にnullファイル-nを指定します(-n, --null)。
sox -d -n
C:\wav>sox -d -n

Input File     : 'default' (waveaudio)
Channels       : 2
Sample Rate    : 48000
Precision      : 16-bit
Sample Encoding: 16-bit Signed Integer PCM

In:0.00% 00:11:07.73 [00:00:00.00] Out:32.0M [ =====|===== ] Hd:0.0 Clip:0

デフォルトのサンプリングレートは48kHzになります。

実践の入力条件と一致させるにはオプションで変更します(入出力ファイルの形式オプション)。
sox -c 1 -r 44100 -d -n 
これでサンプリングレート44.1kHzモノラルに変更できました。

Input File     : 'default' (waveaudio)
Channels       : 1
Sample Rate    : 44100
Precision      : 16-bit
Sample Encoding: 16-bit Signed Integer PCM

録音レベルの表示は一番下の行にでてきます。

表示の見方は-Sに解説があります。

-25dB以上から表示が始まりピークアウトすると=====!になります。

ピークアウトの抑制にはマイクの音量レベルの調整で対応しないといけないそうです。

-25dB以上しか表示されないのであまり参考になりませんでした。

SoXの自動録音条件設定


(2015.8.8追記。録音したいものが主に人の声ならばsilenceエフェクトよりもvadエフェクトを使ったほうが綺麗に録音できます。SoXで音声感知録音:その5 話し声を準リアルタイム録音

音声感知録音するためにはsilenceエフェクトを使用します。

silence [-l] above-periods [duration threshold[d|%] [below-periods duration threshold[d|%]]

たくさんパラメーターがあってわかりにくいですね。

The SoX of Silenceにパラメーターの具体例とその結果の図示があります。

いままでみたSoundEngine FreeAudacityと違ってsilenceエフェクトはすでに録音されている音声からの静音区間の削除を想定しているためか静音区間の削除の回数の指定のパラメーターがあります。

above-periodsは先頭からの静音区間の削除回数を指定します。

0にすると先頭の静音区間の削除は行われません。

音声感知録音するときは最初の静音区間も削除したいのでabove-periodsは1に設定します。

続くdurationで録音開始条件の持続時間、thresholdで閾値を指定します。

持続時間の指定は「時:分:秒」という形式で行います([[時:]分:]秒[.小数][t])。

持続時間はサンプル数でも指定できますが私は使うことはなさそうです。

閾値の単位はdBかサンプル値の最大値に対する%になります。

(LinuxBeanでman soxをみるとsilenceの項にThreshold numbers may be suffixed with d to indicate the value is in decibels, or % to indicate a percentage  of  maximum value of the sample value (0% specifies pure digital silence).と記載がありますがマイク入力のときは何を最大値にするのかがわかりません。)

閾値以上の音声が持続時間以上になると録音開始となります。

次のbelow-periodsで回数を指定すると続いて指定する持続時間と閾値を満たす区間が出現した回数以降の音声を削除します。

閾値以下の音声が持続時間以上になる区間がbelow-periodsの回数以上となると録音が停止します。

below-periodsの回数が1のときは1回目の録音停止条件で録音終了


sox -c 1 -d test.wav silence 1 00:00:00.5 -35d 1 00:00:03 -35d
これは-35dB以上の音が0.5秒以上持続したらモノラルでtest.wavに録音開始し、-35dB以下の音が3秒以上持続したら録音終了するという指示です。

test.wavをAudacityで波形表示させてみます。


発声が始まって終了するまでが録音されています。

-lオプションをつけると停止条件の持続時間分は録音されます。
sox -c 1 -d test.wav silence -l 1 00:00:00.5 -35d 1 00:00:3 -35d

今度は停止条件の持続時間3秒分も録音に残っていることがわかります。
sox -c 1 -d test.wav silence -l 1 00:00:00.5 -35d 2 00:00:3 -35d
今度はbelow-periodsを2回にして1回目の停止条件を無視するようにしました。


最後の静音区間は無視される1回目静音区間の3秒と-lオプションで残される2回目の静音区間3秒の合計6秒になると予想したのですが、残された静音区間は9秒になっていますね。

差の3秒の静音区間の由来はどこでしょう?
sox -c 1 test.wav test2.wav silence 1 00:00:00.5 -35d 2 00:00:3 -35d
今度はこのtest.wavを入力にして-lオプションを除いて他は同条件でsilenceエフェクトをかけてみました。


最後の静音区間が3秒になっていますね。

これは1回目の無視された静音区間の3秒が残っていると理解できます。
sox -c 1 test.wav test3.wav silence -l 1 00:00:00.5 -35d 1 00:00:3 -35d
今度は-lオプションを残してbelow-periodsを1回にしてみましたが、これも予想通り-lオプションで残される1回目の静音区間3秒が残ったものでした。

結局below-periodsを2にしたときの3秒はどこからきたのかよくわかりませんでした。

below-periodsの回数が負値のときは録音停止条件で録音一時停止になる


below-periodsを-1にすると録音停止条件に合致すると録音一時停止状態となり、また録音開始条件に合致すると録音開始するということを繰り返します。
sox -c 1 -d test.wav silence 1 00:00:00.5 -35d -1 00:00:1 -35d
これを実行するとCtrl+Cをキーボードから押すまで録音が継続します。

-35dB以下の静音区間が1秒間持続すると録音を一時停止し-35dB以上の音が0.5秒以上持続すると録音を開始するということを繰り返します。

録音している状態かどうかは録音レベル表示の左側のOutの数値が増加することから確認できます。

-lオプションとつけないときは停止条件の静音区間は録音に含まれません。
sox -c 1 -d test.wav silence -l 1 00:00:00.5 -35d -1 00:00:1 -35d
-lオプションをつけると停止条件の静音区間も録音に含まれます。

これでSoundEngine Freeと同様のことができるようになりました。

自動録音条件の決定に悩む


-35dBで自動録音条件決定と思って翌朝同じパソコンでやってみると全く録音されませんでした。

-45dBまで落とすと録音されますが録音が停止しませんし、なかなか都合よくいきません。
sox -c 1 -d -n trim 0 10 stats
これで10秒間のバックグラウンドの情報をみてみました。

DC offset  -0.000000
Min level  -0.101990
Max level   0.102386
Pk lev dB     -19.80
RMS lev dB    -42.53
RMS Pk dB     -31.70
RMS Tr dB     -45.70
Crest factor   13.70
Flat factor     0.00
Pk count           2
Bit-depth      13/16
Num samples     480k
Length s      10.000
Scale max   1.000000
Window s       0.050
Done.

statsに結果の見方の解説がありますがなかなか難しいです。

RMSとはRoot Mean Squareの略で日本語では「実効値」というそうです(偏ったDTM用語辞典 - アールエムエス:RMSとは - DTM / MIDI 用語の意味・解説 | g200kg Music & Software)。

高校の物理で習ったように気がします、、、

RMS Pk dBをバックグラウンドのdBと考えると-30dBが妥当なレベル設定と考えられます。
sox -c 1 -d "%DATE:~-10,4%%DATE:~-5,2%%DATE:~-2,2%_%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%.wav" trim 0 10 silence 1 00:00:00.5 -30d -1 00:00:01 -30d 
Windowsの場合はこれで10秒間モノラル音声の自動録音が試せます。

結果は「年月日_時分秒.wav」に保存されます。(ただし、0時から9時までのファイル名の時刻の前には半角スペースが入ります。)
sox -c 1 -d "$(date +%Y%m%d_%H%M%S).wav" trim 0 10 silence 1 00:00:00.5 -30d -1 00:00:01 -30d
LinuxBeanはこれで同じことができました。

録音されたwavファイルをAudacityで再生してみましたがどうも思ったように録音されていません。

silenceのパラメーターのthresholdの%が何に対する割合なのかいまだにわかりませんが、silenceの例ではdBよりも%がよく使われているように思えます。
sox -c 1 -d "%DATE:~-10,4%%DATE:~-5,2%%DATE:~-2,2%_%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%.wav" trim 0 10 silence 1 0.05 2% -1 0.5 1%
durationは少数で指定した場合はサンプル数ではなく秒数になるようです。

いまのところはこの条件が妥当のようです。

録音した音声からバックグラウンドノイズを消去する

sox -c 1 -d -n trim 0 10 noiseprof noise.noise-profile
これで10秒間のバックグラウンドプロファイルがnoise.noise-profileに保存されます。
sox test.wav test-noise.wav noisered noise.noise-profile 0.3
これでtest.wavからバックグラウンドノイズが除去されてtest-noise.wavに保存されました。

最後のパラメーターの0.3は0から1の範囲で指定でき、数値が大きいほどノイズが除去されます(noisered [profile-file [amount]])。

参考にしたサイト


SoX - Sound eXchange | HomePage
CUIの音声ファイル処理プログラム。

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

SoX - Sound eXchange - Browse /sox at SourceForge.net
SoXのダウンロードページ。

RareWares
libmp3lame 3.99.5をインストールするとWindowsのSoXでmp3が扱えるようになりました。

ubuntu - How to add a mp3 handler to sox? - Super User
ubuntuのSoXでmp3を扱えるようにする方法。

The SoX of Silence
silenceエフェクトの例と結果の図示。

偏ったDTM用語辞典 - アールエムエス:RMSとは - DTM / MIDI 用語の意味・解説 | g200kg Music & Software
RMSは「実効値」のことらしいです。

次の関連記事:SoX(Sound eXchange)で音声ファイルの長さの差をとる

PR

0 件のコメント:

コメントを投稿