Born Too Late

Yuya's old tech blog.

DSL で音声教材をハックするツール AudioHacker を作った

2014-02-03 01:30:57

はじめに

この記事は試験前日に部屋の模様替えをやりきったときみたいな気持ちで書かれています。

TL; DR

英語教材をハックしたい。

— Yuya Takeyama (@yuya_takeyama) 2014, 2月 2

例えば英語教材の CD のトラックの切り分けが気に入らなくて、何人かで協力して切り分ける作業をしたいとき、音源自体を Web 上にアップするのは著作権法上問題になるので、そこを回避しつつコラボレーションするためのソリューションが必要。

— Yuya Takeyama (@yuya_takeyama) 2014, 2月 2

全員が同じ音源を持っていて、Web 上では音源上のどこからどこまでをカットするのか、という情報だけ共有するようにして、それを元にそれぞれの PC 上で音源のカットまでできれば、目的が達成できる。

— Yuya Takeyama (@yuya_takeyama) 2014, 2月 2

特定の CD からの音源の切り取り方を指定するフォーマット無いのかな。それさえあればあとは GitHub でなんとかなる。

— Yuya Takeyama (@yuya_takeyama) 2014, 2月 2

Ruby で CD の取り込みができればいいのかな。エンコード済みの音源を入力とする場合、ファイル名フォーマットのズレを吸収するのがめんどい。

— Yuya Takeyama (@yuya_takeyama) 2014, 2月 2

CD を読み込むプログラムを書く方法ちょっと調べてもわからなそうだったしエンコード済みの音源を入力にする方が楽かな。ファイル名でソートした順にトラック番号割り当てるルールで大体問題なさそう。

— Yuya Takeyama (@yuya_takeyama) 2014, 2月 2

英語学習ほっぽりだした ffmpeg インストール始めた

— Yuya Takeyama (@yuya_takeyama) 2014, 2月 2

背景: TOEIC に初挑戦します

会社の同僚に誘われて、TOEIC 受けることにしました。
今回が初挑戦で、2014 年 3 月 16 日に行われる第 188 回を受験します。

どう勉強したもんかと思ったんですが、その同僚がこんな教材を薦めてくれました。

DUO 3.0 というのは英語の例文が 560 文掲載されていて、それをもとに重要な単語や熟語を覚えられるよ、みたいなヤツです。
語彙力が圧倒的に足りない私にとっては素晴らしい教材に思われます。
TOEIC 用に作られたものではありませんが、TOEIC 用としても十分実用的で、軽くググった限りではなかなか有名な教材のようです。

個人的には単語とか熟語だけを丸暗記するのは辛くて、むしろひとかたまりの例文の方が忘れにくいし応用もしやすい、と思ってます。
まぁ、大昔に読んだ「超」勉強法の受け売りなんですが。

そして、その DUO 3.0 の例文と訳文、さらにその中の単語・熟語の音読が聞けるのが DUO 3.0 / CD 基礎用です。

さっそく CD をリッピングして iPhone に入れてみたんですが、どうもトラック分けがイマイチ。
私としては 1 トラック 1 文に分かれていてほしいんですが、実際は 1 トラックに対して 2 文入ってたりします。
そしてそれらは前述の通り、英文、日本文、単語や熟語がごちゃ混ぜになってます。

これでは私がやりたい勉強法に使えません。

ぼくがかんがえたさいきょうの英文暗記法

早い話が i暗記 + 音声ですね。
そういったプログラムについても今のところ私自身で実装することになってるんですが、いいのがあれば教えてください。

まずは音声データを用意

オリジナルデータとしてはもちろん DUO 3.0 / CD 基礎用を使うとして、それをいい感じに切り分ける必要があります。
しかし 560 もの例文となるとあまりの量に目眩がしてしまいます。
それを、インターネット上のみんなと協同作業することで解決しよう、というのは自然な発想です。

ですが、独自に切り取った音声ファイルを勝手にアップロードしたりすると、当然著作権法上問題となります。
そこで、CD は各自購入した上で用意して、その「切り取り方」だけを共有できればいいんじゃないか、と考えました。
「切り取り方」は Ruby の言語内 DSL としてコード化し、GitHub のリポジトリ上で共有できれば、プルリクエストによるコラボレーションも可能となります。

音声教材ハックツール、AudioHacker のご紹介

そこで作られたのがこの AudioHacker です。
AudioHacker は以下のような機能・特徴を持っています。

単純に範囲指定で音声を切り出すだけなので、グリッチとかのアート的なヤツには使えません。

「切り取り方」を定義する DSL は以下のようなフォーマットです。

directory というのは、後に示す設定ファイル中の 1 番目のディレクトリから読み込むよ、という宣言です。
そして file はそのディレクトリ内で 1 番目のファイルを読み込むよ、という宣言。
なお、ここでいう「1 番目のファイル」というのは、ディレクトリ内のファイルを昇順でソートした順番を元にしています。
start は開始位置、duration は長さをそれぞれ秒で指定しています。
少数を使うこともできますし、文字列で 00:00:15.20 みたいなフォーマットで指定することもできます。
要は FFmpeg の -ss オプションや -t オプションに指定できるフォーマットが使えます。

そして設定ファイルは以下の通りです。
こちらは、利用者それぞれの環境によってディレクリ名もファイルフォーマットも異なるので、リポジトリ上では共有しないものです。

pattern というのは入力ファイルのファイルパターンを Ruby の Dir.glob で使えるフォーマットで指定します。
input_dir は入力ディレクトリのパスを指定します。
DUO 3.0 / CD 基礎用は 5 枚組なので、5 ディレクトリ指定しています。
なお、内部で利用している streamio-ffmpeg の制限上、ディレクトリ名もファイル名も ASCII にしておくのが無難です。
切り取られたファイルは output_dir で指定したディレクトリに書き出されます。

AudioHacker で DUO 3.0 / CD 基礎用を英文だけに切り取ろう

早速 DUO 3.0 / CD 基礎用を英文だけに切り取るための定義ファイルを用意しました。

DUO 3.0 / CD 基礎用 English Sentences for AudioHacker

...ただし、ひとりでは大変なのでまだ 10 文だけしか定義できてません。
Patches welcome ということで。

以下の手順で DUO 3.0 / CD 基礎用の切り取りが実行できます。

  1. DUO 3.0 / CD基礎用を用意する
  2. 適当なソフトで音声ファイルにリッピング (このとき、1 Disc 1 ディレクトリ、1 トラック 1 ファイルとし、ファイル名はソートできるよう先頭をトラック番号とすること)
  3. 以下の手順で AudioHacker を実行 (FFmpeg と Ruby 1.9 以上と Bundler 1.5 以上が必要)

FFmpeg は Mac を使っている人は brew install ffmpeg とかすれば入ると思います (各位頑張って入れてください)。

上手く行くと、以下のように出力されます。

[caption id="attachment_2426" align="aligncenter" width="480" caption="AudioHacker を実行した様子"]AudioHacker を実行した様子[/caption]

設定ファイルに output_dir として設定したディレクトリにはファイルが出力されます。

[caption id="attachment_2433" align="aligncenter" width="480" caption="AudioHacker が出力したファイル"]AudioHacker が出力したファイル[/caption]

終わりに

音声教材をハックしてコード化して共有するためのツール AudioHacker の紹介でした。

とりあえず Proof of Concept レベルの実装ではありますが、「GitHub 上でコラボレーションして音声教材をハックする」というアイディアは我ながらなかなか面白いんじゃないかと思ってます。
まぁ現状 Git や GitHub を当たり前に使えるエンジニアでないと使えないツールなので、このままでの普及は難しいとは思いますが...

さて、あとは自動出題用のプログラムを用意する必要がありますが、どう考えても TOEIC 受験時までに回収できない投資となりますし、とりあえずは本を読みながらアナログに勉強する予定だったりします。
続きはまたいつか。