LoginSignup
12
4

More than 3 years have passed since last update.

SoX を使い音声ファイルの無音部分を起点にして音声を分割する

Last updated at Posted at 2017-04-06

SoX を使い無音部分を起点にして長い音声を分割する(2020/04/12 版)

(3年ほど前に書いた記事だが,macOS 10.15.4 の環境に合わせて一部を修正・更新)

大まかな手順

  1. Global Voice English 3で音声吐き出し
    1. 英単語を1語ずつ6秒間隔で読み上げさせて,それを1つの WAV ファイルとして保存
  2. SoX のインストール
  3. sox コマンドでで音声の分割
  4. sox コマンドで音声の MP3 形式への変換
  5. 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 の依存パッケージ(でいいのかな?)としてインストールされることが確認できる。

Screen Shot 2020-04-11 at 22.11.29.png

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時間半ほど。

12
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
4