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

技術のメモ帳

気が向いたときに書いてます

[Ruby]sayコマンドとffmpegで多言語音声ファイルを作成する

Mac独自のsayコマンドを触っていたら、案外面白かったので、以前Google Apps Scriptで書いたSpreadSheetでテキストを翻訳する関数を使って、国語学習で使えそうな音声ファイルを作成するスクリプトRubyで書いてみました。

音声サンプル

以下がスクリプトの実行結果で生成される音声ファイルです。

どんなものを作るのかは、聴いてもらった方が早そうな気がしますので、まずは聴いてみてください。

やっていること

  • 翻訳データを作成し、CSV化(Google Apps Script)
  • sayコマンドで、CSVの各言語のテキストを音声ファイル化(Ruby)
  • ffmpegで音声ファイルを結合(Ruby)

ffmpegを使うので、未インストールの場合は、前もってbrew install ffmpegでインストールしてください。

用意するCSV

Google Apps Scriptで、SpreadSheetを新規作成し、[ツール]→[スクリプトエディタ]を起動し、次の関数を入力します。

function translate(text, sourceLanguage, targetLanguage) {
  if (typeof text != 'string') return null;
  try {
    return LanguageApp.translate(text, sourceLanguage, targetLanguage);
  } catch(e) {
    return e.toString();
  }
}

これで、SpreadSheetからtranslate関数が利用できるようになりますので、次のようなデータを作成してください。

  • 先頭行に言語コードを入力。
  • 一番左の列を原文とし、以降の列に=translate($A2, $A$1, B$1)といった関数を書きます。
  • 上記はB列の場合の例ですが、C列以降はB列のセルをコピペするだけ。
  • 列は、何列でも問題ありません。

作成例としては、次のようになります。

言語コードなんぞや?という方は、SpreadSheetでテキストを翻訳する関数を参照してください。

CSVのエクスポート

データが準備できたら、[ファイル]→[形式を指定してダウンロード]→[カンマ区切りの値(.csv)]を選択して、エクスポートします。

Rubyの準備

translated_voice.rbを新規作成して、次のコードを入力します。

rbファイルと同階層に、先ほどエクスポートしたCSVファイルを、data.csvとして配置します(引数からパスを指定できますが、簡単なので)。

これで準備は整いました。

動作確認

CLIで次のコマンドを実行すると、translated_voice_YYYYMMDDHHMMSS.mp3が生成されます。

$ ruby translated_voice.rb

指定した言語コードの音声が出力されない場合

[システム環境設定]→[音声入力と読み上げ]→[テキスト読み上げ]→[カスタマイズ]から、音声ファイルをダウンロードしてください。

言語コードの声を変更したい場合

次のHashを適宜編集してください。KeyがCSVで設定した言語コードで、Valueがボイス指定となります。

voice = {
  en: :Allison,
  es: :Diego,
  fr: :Aurelie,
  ja: :Otoya,
  zh: :"Ting-Ting"
}

意外と使えるかも…!?

遊びで作ったスクリプトではありますが、単語〜複数センテンスのレベルまで翻訳/音声出力できるので、外国語を耳から学ぶ教材としては、けっこう便利かもしれません。単語帳感覚でリストを作成し、音声ファイルをスマホで持ち歩けば、どこでも勉強ができそうな予感

もしご興味をもたれたら、使ってみてください。気が向いたら、gemにしてみようと思います。

参考リンク

Macのsayコマンドの使い方 - Qiita

開発環境

Mac OS X 10.10.5
ruby 2.2.2p95
ffmpeg version 2.6.3