【Python】これなら運転中でも試験勉強できる!?gTTSを使ってテキストを音声化してみた。

Python

qiita記事より

はじめに

概要

自動車で移動中でも、自分がまとめた学習内容を聞き流せるように、gTTSを使ってテキストファイルを音声ファイルに変換してみました。

作るきっかけ

まず、私は社会人でもありますが、大学生でもあります。当然試験もあり、試験はキャンパスで行われることが基本です。なので、移動が必要なのですが最近電車に乗るのが億劫すぎて、、車移動を中心にしています。
そのため、「見る」復習を移動時間にすることが難しいのです。(間違いなく事故る)

どうにかならんかなー、と~~現実逃避~~考えていたのですが、

車の中で聞き流せるようにすればいいじゃないか

とふと思いつき、さっと調べると今回のネタである「gTTS」なるものを見つけた次第です。

gTTSとは

簡単にgTTSの紹介を。といっても公式ドキュメントの内容を羅列しただけのものですが。

  • Google Text-to-Speech の頭文字
  • Google翻訳のテキスト読み上げAPIと連携するためのライブラリ・CLIツール
  • mp3データをファイル、バイトデータ、標準出力に出力する
  • 柔軟な前処理とトークン化が特徴

from gTTS Documentation。Google翻訳を読み上げるAPIと連携するためのツールなんですね。

from [gTTS Documentation](https://gtts.readthedocs.io/en/latest/index.html).

作ってみよう

動作環境

  • Ubuntu 20.04.4 LTS
  • Python 3.8.7
  • gtts 2.3.0

gTTSは以下のコマンドでインストールできます。

pip install gTTS

ん?pipがない?? Google Is Your Friend

step 0

簡易的なテキストを変換するだけであれば、コマンドラインでgtts-cliを実行するとあっという間に音声ファイルが出来上がります。

gtts-cli 'ドレミファソラシド' --output DoRemi.mp3
gtts-cli 'ドレミファソラシド' -l ja --output ドレミ_ja.mp3

デフォルトは英語(=en)なので、DoRemi.mp3は英語っぽく、ドレミ_ja.mp3は日本語のアクセントでしゃべってくれます。

ちなみに--outputをつけないと、ちゃんと(リファレンス通り)標準出力にバイナリが出力されます。
※音声再生がされるわけではないですw

出力した音声ファイル

Doremi.mp3
ドレミ_ja.mp3

step 1

さて、step0の内容は自分が求めている内容ではないので、プログラムを書いていこうと思います。
まずは基本的な使い方を学ぶために簡単なコードを書いてみます。

ソースコード

speak.py
from gtts import gTTS
tts = gTTS('ドレミファソラシド', lang='ja')
tts.save('ドレミ_ja.mp3')

こちらのコードはstep0の内容をコードにしたものです。

  • gTTS()でテキストを指定した言語で音声変換
  • langは省略可能。省略時は’en’で動く
  • save()でファイルに保存

使い方がとっても簡単ですねぇ・・・

出力した音声ファイル

ドレミ_ja.mp3
どれみ

step2

先ほどは音声データの素になるテキストはプログラムにべた書きでしたが、
実際は別ファイルのテキストを読み込ませたいので、そのようにプログラムを追記していきます。

読み込ませるファイル

Sample.md
寿司!てんぷら!芸者!侍!
これがジャパニーズ文化でーす!

しょうもないテキストファイルを読み込ませようと思います。後述のspeak.pyと同じディレクトリに配置しています。

ソースコード

speak.py
from gtts import gTTS

f = open('Sample.md', 'r')
tts = gTTS(f.read(), lang='ja')
tts.save('Sample.mp3')
f.close()

同じディレクトリにある、Sample.mdを読み込んで音声ファイルを作ります。後の流れはstep1と同様です。
今回はSample.mp3というファイル名にして出力しました。

出力した音声ファイル

Sample.mp3

ロクな情報を喋るわけではないですが、テキストファイルの内容を音声に変換できたことが確認できます。

※open()やread()、close()はPythonのリファレンスが友達です。是非仲良くしてあげてください。

step3

step2ではファイル名をベタ書きにしていました。
ただ、科目の単元でファイル名を変えたいですし、読み込みたいファイルは一つとは限らないので、
ファイル形式を指定して一括で変換するプログラムにしようと思います。

Github にプッシュ済みなので、読み込みファイルは左のリンクから参照ください。

ディレクトリ構成

  • root
    • sound
    • sample1.md
    • sample2.md
    • speak.py

ソースコードと同じディレクトリに2つmdファイルを配置し、soundディレクトリに出力します。

ソースコード

speak.py
from gtts import gTTS
import re
import glob

files = glob.glob("*.md")
for file in files:
  f = open(file, 'r')
  lines = f.readlines()
  # 先頭の見出し文字を削除
  text = "".join(map(lambda x: re.sub('^#+ ', '', x), lines))
  tts = gTTS(text, lang='ja')
  tts.save('sounds/' + file.split('.')[0] + '.mp3')
  f.close()

ちょっとコード量増えたので補足。

  • globを使って同じフォルダのmdファイルをリストアップします。
  • 見出し文字が入っていると「しゃーぷしゃーぷ」とか言い出すので、re.subで見出し文字を削ってます。
  • mdファイルと同じ名前のmp3ファイルを作っています。

※ globやreも友達です。是非(略

soundフォルダの下に、テキストが変換された音声データが出力されます。

出力した音声ファイル

Sample1.mp3
Sample2.mp3

車内学習の準備

出来上がった音声ファイルは、車で再生できるデバイスに入れてあげましょう。
私はSDカードにコピーして再生してました。(人のぬくもりが感じられる作業ですね)

実際に学習に使ったときは、再生モードをランダムにして聞き流していました。
おおよそ覚えたな、というキーワードになったらスキップできるのも良かったですね。
(オーディオ操作はハンドルについたボタンをポチるので、目線はちゃんと前のまま)

感想

  • Python初心者の自分にも簡単に使えた
  • コマンドライン叩くだけならそもそもPythonの知識要らん。
  • 思った以上にちゃんと読んでくれる。
  • 漢字の読み間違えとかもうちょっと多くなるのかと思っていた。
  • 「てにおは」はあやしい。
  • -は無視してくれるみたい。読めないだけ?
  • !マークは重ねると「感嘆符」とかしゃべりだす。

最後に

結構簡単に作れるので、聞き流しファイルを作りたい方は是非トライしてみてくださいー。
今回触らなかったPre-processingやtokenizingの項にも色々書いてあったので、
もう少しカスタマイズもできるのかもしれない。。。

当たり前ですが、運転中はあくまで運転に集中しましょうね。
・・・試験?ヤマ外したので惨敗でしたが何か。。。

参考文献

公式

GitHub - pndurette/gTTS: Python library and CLI tool to interface with Google Translate's text-to-speech API
Python library and CLI tool to interface with Google Translate's text-to-speech API - pndurette/gTTS
gTTS — gTTS documentation

自身で作成したコード

GitHub - tsakoff/speak_text: gTTSを使ってテキストファイルを喋らせる
gTTSを使ってテキストファイルを喋らせる. Contribute to tsakoff/speak_text development by creating an account on GitHub.

コメント

タイトルとURLをコピーしました