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

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

## Introduction
まず、私は社会人でもありますが、大学生でもあります。
当然試験もあり、試験はキャンパスで行われることが基本です。

なので、移動が必要なのですが最近電車に乗るのが億劫すぎて、、車移動を中心にしています。
そのため、「見る」復習を移動時間にすることが難しいのです。（間違いなく事故る）

どうにかならんかなー、と~~現実逃避~~考えてたら
「車の中で聞き流せるようにすればいいじゃないか」
とふと思いつき、さっと調べると今回のネタである「gTTS」なるものを見つけた次第です。

### gTTSとは
簡単にgTTSの紹介を。といっても公式ドキュメントの内容を羅列しただけのものですが。
- Google Text-to-Speech の頭文字
- Google翻訳のテキスト読み上げAPIと連携するためのライブラリ・CLIツール
- mp3データをファイル、バイトデータ、標準出力に出力する
- 柔軟な前処理とトークン化が特徴

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`をつけないと、ちゃんと(リファレンス通り)標準出力にバイナリが出力されます。
音声再生がされるわけではないですｗ

#### 出力されたファイル
- [DoRemi.mp3](https://github.com/tsakoff/speak_text/blob/main/step0/DoRemi.mp3)
- [ドレミ_ja.mp3](https://github.com/tsakoff/speak_text/blob/main/step0/%E3%83%89%E3%83%AC%E3%83%9F_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](https://github.com/tsakoff/speak_text/blob/main/step1/%E3%81%A9%E3%82%8C%E3%81%BF.mp3)

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

#### 読み込ませるファイル
- [Sample.md](https://github.com/tsakoff/speak_text/blob/main/step2/Sample.md)
```
寿司！てんぷら！芸者！侍！
これがジャパニーズ文化でーす！
```

#### 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](https://github.com/tsakoff/speak_text/blob/main/step2/Sample.mp3)

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

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

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

#### 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フォルダの下に、テキストが変換された音声データが出力されます。

#### ソースコード
- [speak.pyとinputファイルとoutputファイル](https://github.com/tsakoff/speak_text/tree/main/step3)

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

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

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

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

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

## 参考文献
- [GitHub: gTTS](https://github.com/pndurette/gTTS)
- [gTTS Documentation](https://gtts.readthedocs.io/en/latest/index.html)

- 今回作ったソースコードと元ネタのテキスト、音声ファイル全部
  - [my GitHub Repository](https://github.com/tsakoff/speak_text)