読者です 読者をやめる 読者になる 読者になる

Duo3.0:560個の歌詞付きMP3の作成

f:id:mr_sorao:20161216141359j:plain

 最近、一念発起して英語の学習を始めました。
使っている教材は『Duo3.0』、選んだ理由は、「定番だから」です。

 さて、ネットを見ると、リスニング用CDからiPhoneに音源を転送して、電車の中などで手軽に学習をするという素敵な学習の方法が載っております

やってみたいけど・・・、自分のスマホAndroid・・・

 ネットの情報では、NHKの『語学プレイヤー』というアプリを使えばAndroidでもいい具合に再生できる、ということなので、まずはそれを試してみました。

 しかし問題が・・・。私はネットの情報を利用して560個に分割したmp3を作成して使ったのですが、細かく分割されたmp3は歌詞を含んでいないのです。しかし私は耳で聴くだけではなく、英文も和訳もその場で見たいのです。

 ネットで紹介されているDuo3.0の音源に歌詞を挿入する手段としては、Duo3.0の45章のセクション別にmp3を作り、出来上がった45個のmp3に手作業で歌詞を挿入するという方法があります。でもその方法では一つのフレーズをリピートして繰り返し聞く、という操作がスムースには出来ません(A地点B地点を設定してリピートとか面倒です、私はワンタッチで操作したいのです)。一方、私の語学力では英文を見ながら一つのフレーズを何度も繰り返して聴く必要があるのです。

 だからと言って、560個のmp3の全てに手作業で歌詞を挿入するなんて、想像しただけで気が遠くなります。

 ・・・ということで、560個のmp3に歌詞を挿入するアプリを作りました。

使った言語はJavaです。
そのソースを公開します。

 プログラム経験が全く無い、という方には稼働環境を設定するのが難しいかもしれませんが、コンパイル・クラスパス・そして実行などの概念が判る方でしたら、560個の歌詞付きMP3が簡単に出来上がるかと思います。

 追記:次日記にJava実行方法の説明を書きました

<完成したmp3の動作について>
・JetAudioPlusというアプリで快適に動作します(冒頭のスクリーンショット)。これが私が使っているアプリです。このアプリは500円程の有料アプリです。速度調整は50%から200%、一曲(ワンフレーズ)リピート、アルバムリピート(セクション別連続再生)、フォルダを指定しての再生(No1からNo560まで連続再生)、一曲ごとに停止、などの機能があります。音楽再生プレイヤとしても定番ではないでしょうか。
NHKの語学プレイヤーでは残念ながら歌詞の表示ができませんでした。この原因はおそらくmp3のタグのバージョンの不一致だと思います。語学プレイヤーが理解できるタグのバージョンは何であるのか、検索して探してみたのですが、残念ながらその情報を入手することは出来ず、その時点で語学プレイヤーの利用は諦めました。
iPhone等は持ってないのでわかりません。でもきっと動くという予感がします。

追記:知人のiPadで、歌詞が表示されることを確認できました。iTuneってmp3を直接読むのではなく、iTune画面にmp3をドラッグ&ドロップすると、何やら変換処理らしきものが作動して、その成果物を読み込むのですね。知らなかった、無知ですみません。

<使用したmp3操作用ライブラリについて>
こちらを使いました。ホームページのサンプルコードを見て、「あら簡単」と思ったのでこいつを使うことにしました。
http://www.beaglebuddy.com/
ダウンロードしてJava環境に放り込んで下さい。

<作業概要>
1.Duo3.0のCDから560個のmp3を作る。作り方はこちらのサイトなどを参考にして下さい。
https://eigonokai.jp/duo30-splitting-method/
http://dokugakueigo.com/how-to-study-duo2/

 「001.mp3~560.mp3」と名前がついた560個のmp3が完成したら、 "C:\tmp\mp3\" というフォルダを作ってそこに置いて下さい

2.英文と和訳のテキストファイルをそれぞれ作って下さい。
 歌詞の作成元データは、「Duo3.0 歌詞」というキーワードでGoogle先生に聞いて下さい。

 私はこちらの情報を頼りに

http://review.1hiro.net/syo-ga-1.html

 エクセル形式の歌詞を入手し、エクセルを開き列幅を思いきり広くしてから「名前を付けて保存」でprn形式を指定して保存したファイルを活用し作成しました。CSV形式で保存したファイルを利用するのでは、妙な位置にダブルクォーテーションが入ってしまうのが嫌でしたので。でも最もシンプルなテキストファイルの作成方法としては、DUO歌詞のエクセルとメモ帳を左右に並べて開いておいて、エクセルから歌詞をコピーしてメモ張に貼り付ける、という方法が挙げられますね。

 英文は「en.txt」、和訳は「ja.txt」という名前にして、 "C:\tmp\txt\" というフォルダを作ってそこに置いて下さい。文字セットはWindowsのデフォルト「Shift-JIS」のままで作成して下さい。

 テキストファイルを作成したら、念のため、560行になっていることはきちんと確認して下さいませ。アプリはそこまで確認していませんので。

3.Javaアプリケーションをコンパイルして実行です。もしもeclipseを使っているのなら、ソースファイルにマウスを置き、右クリック-実行-Javaアプリケーションの実行を行うだけです。

< ソースです( DuoMp3LyricsInserter.java ) >

 

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.DecimalFormat;

import com.beaglebuddy.mp3.MP3;

public class DuoMp3LyricsInserter {

    private static final int S_NUMBER = 1;
    private static final int E_NUMBER = 560;
    private static final String EN_FILE_NAME = "en.txt";
    private static final String JA_FILE_NAME = "ja.txt";
    private static final String TXT_DIR = "c:\\tmp\\txt\\";
    private static final String MP3_DIR = "c:\\tmp\\mp3\\";
    private static final String TXT_CHARSET = "Shift-JIS";
    private static final String MP3_CHARSET = "UTF-16";

    private static BufferedReader en_reader;
    private static BufferedReader ja_reader;

    private static String album = "";
    private static int countInAlbum = 0;
    private static boolean hasErrors = false;

    public static void main(String[] args) {
        try {
            /*
             * テキストファイルのオープン、"en.txt"と"ja.txt"が用意されている前提
             */
            File en_f = new File(TXT_DIR + EN_FILE_NAME);
            File ja_f = new File(TXT_DIR + JA_FILE_NAME);
            en_reader = new BufferedReader(
                          new InputStreamReader(
                            new FileInputStream(en_f),
                            TXT_CHARSET
                          )
                        );
            ja_reader = new BufferedReader(
                          new InputStreamReader(
                            new FileInputStream(ja_f),
                            TXT_CHARSET
                          )
                        );
            /*
             * 各MP3ファイルを更新します
             */
            for(int i = S_NUMBER; i <= E_NUMBER; i++ ){
                duoLyricsInsert(i);
            }
            /*
             * テキストファイルのクローズ
             */
            en_reader.close();
            ja_reader.close();
            /*
             * 更新後のMP3ファイルの歌詞を表示する
             */
            for(int i = S_NUMBER; i <= E_NUMBER; i++ ){
                duoLyricsDisplay(i);
            }
            if (hasErrors) {
                System.out.println(" Error Occured Anywhere");
            }
            else {
                System.out.println(" NO-ERROR Good Job!!");
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void duoLyricsInsert(int i) throws IOException {
        /*
         * "001.mp3" - "560.mp3" を更新する前提でファイル名を生成
         */
        DecimalFormat formatter = new DecimalFormat("000");
        /*
         * MP3ファイルを取得
         */
        MP3 mp3 = new MP3(MP3_DIR + formatter.format(i) + ".mp3");
        /*
         * テキストファイルの1レコード取得
         */
        String en = en_reader.readLine();
        String ja = ja_reader.readLine();
        /*
         * 同一アルバム内の曲順計算
         */
        if (!album.equals(mp3.getAlbum())) {
            countInAlbum = 0;
            album = mp3.getAlbum();
        }
        countInAlbum++;
        /*
         * 歌詞を生成
         */
        StringWriter buffer = new StringWriter();
        PrintWriter writer = new PrintWriter(buffer);
        writer.println();
        writer.print("[");
        writer.print(album);
        writer.print("(");
        writer.print(countInAlbum);
        writer.print(")]-[");
        writer.print(mp3.getTitle());
        writer.print("]");
        writer.println();
        writer.println();
        writer.println(en);
        writer.println();
        writer.println(ja);
        String lyrics = buffer.toString();
        /*
         * 取得したMP3ファイルのタグに歌詞を挿入(UTF-16エンコード)
         */
        mp3.setLyrics(new String(lyrics.getBytes(MP3_CHARSET), MP3_CHARSET));
        /*
         * MP3ファイルを更新
         */
        mp3.save();
    }

    private static void duoLyricsDisplay(int i) throws IOException {
        /*
         * "001.mp3" - "560.mp3" を更新する前提でファイル名を生成
         */
        DecimalFormat formatter = new DecimalFormat("000");
        /*
         * MP3ファイルを取得
         */
        MP3 mp3 = new MP3(MP3_DIR + formatter.format(i) + ".mp3");
        /*
         * MP3ファイルの番号・エラーの有無・歌詞を表示する
         */
        System.out.print(i);
        if (mp3.hasErrors()){
            System.out.println(" ERROR");
            hasErrors = true;
        }
        else {
            System.out.println(" OK");
        }
        System.out.println();
        System.out.println(mp3.getLyrics());
        System.out.println();
    }
}