#SoX を使い無音部分を起点にして長い音声を分割する(2020/04/12 版)
(3年ほど前に書いた記事だが,macOS 10.15.4 の環境に合わせて一部を修正・更新)
##大まかな手順
-
Global Voice English 3で音声吐き出し
- 英単語を1語ずつ6秒間隔で読み上げさせて,それを1つの WAV ファイルとして保存
- SoX のインストール
- sox コマンドでで音声の分割
- sox コマンドで音声の MP3 形式への変換
- mv コマンドでファイル名の一括変換(リネーム)
###1. 読み上げファイルの作成
単語を1行に1つ並べたテキストファイルを用意しておく。
adverb
alternative
ancestor
正規表現をつかって,文末の改行文字である \r
を対象に,\r<VTML_PAUSE time="6000"/>\r
という文字列(6秒間の無音を挿入するタグとその前後に改行文字)に置換して,以下のようにする(使っているのは,Mac 向けエディタの mi)。やっていることは,Global Voice English 3 の読み上げオプションのタグを入れて,6秒のポーズを入れて読み上げるようにしている。
adverb
<VTML_PAUSE time="6000"/>
alternative
<VTML_PAUSE time="6000"/>
ancestor
<VTML_PAUSE time="6000"/>
上のファイル(TXT 形式)をソフトで読み上げさせて,WAV 形式(input.wav)で保存する。
###2. SoX のインストール
input.wav に含まれる無音部分を起点に分割するために,SoX を使う。まずは,インストール(macOS 10.15.4)。
brew install sox
これを先にやると,lame が入っておらず,MP3 に変換できなくなるので,オプションを付けて再インストール。。。
brew reinstall sox --with-lame
最新版では,上のコマンドを実行しなくてもOKになった(実行しようとしてもエラーになる)。SoX のインストールを実行するだけで,SoX の依存パッケージ(でいいのかな?)としてインストールされることが確認できる。
###3. SoX の sox コマンドで音声の分割
そして,音声を無音部分を起点に区切る。
sox -V3 input.wav out.wav silence -l 1 0.2 0.1% 1 0.2 0.1%: newfile : restart
6秒間の無音部分を起点にひたすら分割されていき,(自分の場合は)3000個の WAV ファイル(3000単語分)ができる。フィアル名は,out.wav とすると,out001.wav,out002.wav のように連番が自動で振られる。
ここで気をつけるべきは,無音の持続時間を 0.2 にするか,0.1 にするか,0.5 にするかで区切れ方が違うこと。極めて短い時間で発音される単語は,そのまま無音扱いで削除されてしまうことがある(生成されたファイル数が,想定数を下回ることがあるので気付ける)。また,音声によっては,意図しないところで区切られてしまい,生成されるファイル数が想定を上回ることもある。
###4. SoX の sox コマンドで音声の MP3 への変換
Excel で sox のコマンドを生成。
列A | 列B | 列C | 列D | 列E | 列F |
---|---|---|---|---|---|
1 | sox | out001 | .wav | .mp3 | sox out001.wav out001.mp3 |
2 | sox | out002 | .wav | .mp3 | sox out002.wav out002.mp3 |
Excel の列 F には CONCATENATE 関数を入力する。=CONCATENATE(B1," ",C1,D1, " ",C1,E1)
を実行して,SoX による MP3 形式への変換コマンドを生成する。Excel の操作としては,各列の値をまとめて下にコピーすればよい(番号がついている out001 なども,Excel では自動で out002 などと値を増やしてくれる)。
列 F のコマンド群をテキストエディタに貼り付けて,FileConvert2MP3.sh として保存し実行。以下のようなただのコマンドの羅列。
sox out001.wav out001.mp3
sox out002.wav out002.mp3
...
###5. mv コマンドでファイル名の一括変換(リネーム)
続いて,Excel で mv のコマンドを生成する。ファイル名は,連番のままでは何の音声ファイルか分からないので,読み上げられている単語と同じにすることにして,以下のような行列を作っておく。
列A | 列B | 列C | 列D | 列E | 列F |
---|---|---|---|---|---|
1 | mv | out001 | .mp3 | adverb | mv out001.mp3 adverb.mp3 |
2 | mv | out002 | .mp3 | alternative | mv out002.mp3 alternative.mp3 |
Excel の列 F には,さきほどと同様に,CONCATENATE 関数を入力する。=CONCATENATE(B1," ",C1,D1, " ",E1,D1)
を実行して,ファイル名変更のための mv コマンドを生成する。さきほどと同じく,Excel の操作としては,各列の値をまとめて下にコピーすればよい。
列 F のコマンド群をテキストエディタに貼り付けて,FileNameChange.sh として保存し,実行。以下のようなただのコマンドの羅列。
mv out001.mp3 adverb.mp3
mv out002.mp3 alternative.mp3
...
ここで気をつけるべきは,同じ単語が混ざっていた場合,mv コマンドを実行すると,上書きされて消えていってしまうので,結果的に,ファイル数が想定数と一致しなくなるので注意。
とここまでやれば,英語の単語音声ファイルの(今回は3000個)作成が完了する。作業の所要時間は,エラー修正とかにも遭遇しつつで,1時間半ほど。