キクタン例文音声をpause付き音声に変換

  • キクタンの例文音声は「単語->英語例文->日本語訳」の順に読み上げる
  • これを「単語->無音->英語訳文->無音」に変更したい
  • 無音の長さを直前の読み上げた項目の長さと同じにすると,音読が大変しやすい
  • 環境: mac, python2.7, macportssoxをインストールした
  • 購入したキクタンの例文音声はdayごとに1ファイル,全部で70daysあって,それぞれに対して処理するのは面倒なので,1ファイルに統合する.

% sox *.mp3 soxed.mp3

  • audacityでsoxed.mp3を開いて「解析 -> Sound Finder 」で文ごとにマークする
  • 「ファイル -> 複数ファイルの書き出し」で文ごとに切り出したファイルを作成する(30分ほどかかる)
  • audacityで書き出されたファイルはxx-01, xx-100, xx-1000というように並んでいる.Finderで表示する分には問題ないが,pythonでos.listdir()した際にうまくいかない.
  • 予め,Finder.appの機能を使ってファイル名を変更しておく.「全選択->2000↑項目のファイル名を変更->名前とカウンタ」にする
  • 音声の構成は正確には「day-xx -> (単語 -> 英語例文 -> 日本語訳)*16 -> day-xx -> ...」となっている
  • day-XXの読み上げを削除する:

```
import os
from subprocess import check_call

wav_files = filter(lambda f: f.endswith('mp3'), os.listdir('./'))
del_files = [i[1] for i in list(enumerate(wav_files)) if i[0] % 49 == 0]
map(lambda f: check_call(['rm', f]), del_files)
```

  • 日本語の音声を削除する:

```
wav_files = filter(lambda f: f.endswith('mp3'), os.listdir('./'))
del_files = [i[1] for i in enumerate(wav_files) if i[0] % 3 == 2]
map(lambda f: check_call(['rm', f]), del_files)
```

  • 無音の音声を作成する:

```
SILENT = '.silent.wav'
silent_files = filter(lambda f: f.endswith('mp3'), os.listdir('./'))
map(lambda f: check_call(['sox', '-v', '0', f, f+SILENT]), silent_files)
```

  • この時点でファイル構成は順番に「単語 -> 無音音声 -> 英語例文 -> 無音音声」となってるので,4つのファイルごとに結合すればよい
  • pause付き音声を作成する

```
all_files = filter(lambda f: f.endswith('mp3') or f.endswith('wav'), os.listdir('./'))
convert_list = [ [all_files[(4*j+i)] for i in range(4)] + \
["day%s-%s.mp3" % ( str(j/16+1).zfill(2), str(j+1).zfill(4) )] \
for j in range(len(all_files)/4 ) ]
map(lambda l: check_call(['sox'] + l), convert_list)
```