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

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

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

##大まかな手順
1. [Global Voice English 3](http://voicetext.jp/products/globalvoice/)で音声吐き出し
    1. 英単語を1語ずつ6秒間隔で読み上げさせて，それを1つの WAV ファイルとして保存
2. [SoX](http://sox.sourceforge.net) のインストール
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 の依存パッケージ（でいいのかな？）としてインストールされることが確認できる。

<img width="858" alt="Screen Shot 2020-04-11 at 22.11.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155513/91b653b3-ff32-a935-01ac-9b31e8a01b2b.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時間半ほど。