OpenJTalkで台本をよみあげる
デモあり。好きに会話させて遊んでみた。
成果物
前提
OpenJTalkをインストールして設定しておくこと。
- OpenJTalkをビルド&インストールする
- 音響モデルを配置する:
*.htsvoice
- 今回のスクリプトを入手する:
git clone https://github.com/ytyaru/Shell.OpenJTalk.Daihon.20210130092306
- 2があるルートディレクトリパスをjtalk.shの
OPENJTALK_VOICE_DIR
変数に指定する
これで準備完了。
流れ
- 台本をTSVで作成する
- コマンドの引数に台本パスを渡す
- 読み上げる
コマンド
コマンド | 概要 |
---|---|
daihon.sh | リアルタイム読み上げ |
daihon_dump.sh | mp3ファイル作成してから読み上げ |
以下のように実行する。TSVファイルパスを引数に渡す。
daihon.sh /tmp/daihon.tsv
daihon_dump.sh /tmp/daihon.tsv
daihon_dump.sh -s /tmp/daihon.tsv
daihon_dump.shはカレントディレクトリにmp3ファイルを出力する。0.mp3
などの名前で連番になる。オプションフラグ-s
をつけるとファイル生成をスキップする。二回目以降に再生させるときはこれを使うとすぐ再生できる。
TSV
書式はつぎの通り。
- 1列目: VoiceID(
*.htsvoice
ファイル名) - 2列目: セリフ
課題
音響モデルつくりたい(.htsvoice)
めっちゃくちゃ大変そう。死を覚悟せねばならない。
- ART503文を人がよみあげる
- 音声ファイルにする
- なんやかんやする(ファイル名、正規化など)
- 半日かけて計算させる
- 音響モデル完成
調査だけはしたい。実践できるかどうかはともかく。
再生中に作成したかったのにできなかった
現状はすべてのファイル作成が完了してから再生している。そのせいで遅い。コールバックのしくみがないからできなかった。
ファイル作成だけは非同期にやっている。ただしwait
で完了を待たないとプロセス自体が完了してしまい、ファイルがないまま再生しようとして何も再生されず、終わってしまう。なので、すべてのファイル作成が完了するまでwait
するしかない。
- 0番の作成完了したら0番を再生する
- 1番の作成を開始する
- 1番の作成完了したら1番を再生する
- ...
みたいな感じにしたかった。できれば3ファイルくらい先まで作成できたら途中で途切れる心配もないと思う。
でもbashでコールバック実装する方法がわからなかった。できるかどうかもわからなかった。なので妥協した。
html5の<audio>
でプレイリストが作れない
HTML5の<audio>
タグでプレイリストができないことに愕然とした。え、そんなこともできないの? 仕方なく自前で実装した。
対象環境
- Raspbierry pi 4 Model B
- Raspberry Pi OS buster 10.0 2020-08-20 ※
- bash 5.0.3(1)-release
$ uname -a Linux raspberrypi 5.4.83-v7l+ #1379 SMP Mon Dec 14 13:11:54 GMT 2020 armv7l GNU/Linux