Youtube の動画を見ていると、ゆっくりボイスや音読さんなどの音声合成エンジンでしゃべっている動画が増えてきて久しいです。僕もそろそろちゃんとした動画を定期的に作って出そうかなーと思って、先日投稿した動画で初めてゆっくりボイスを使いました。「ゆくも!」というブラウザから入力したテキストデータを音声合成して MP3 形式でダウンロードできるサービスで生成しました。
ちょっとした短い動画を作る時の音声素材としてはこの手のクラウドサービスは手軽で良いんですが、がっつり大量の文章を(なかば自動的に)流し込みしたい場合に不向きです。ゆくも!、音読さん、さらには GCP、AWS には有料サービスがありますが、広告収入が見込める動画を作れる自信はないので…できれば文字数制限やライセンスまわりに縛られない無料のエンジンがいいな、という気持ちもあります。
手元で制限なくゴリゴリ音声を生成できれば、例えば WordPress の記事内のテキストを音声化、字幕化して、自動的に記事内の画像や動画を使って動画を生成してくれる WordPress to Video コンバータみたいなのも作れるかもしれません。そうなるとめっちゃ捗りますね。(もう存在してるかもなー?あったとしても痒いところに手が届かないんだろうけど)
OpenJTalk という選択
そこで、5年ほど前から手元で遊んでみていた音声合成エンジン「OpenJTalk」を発掘してチューニングしてみています。時報やら通知を読み上げさせたい時に使ってました。動画目的は今回が初です。
※ なお、厳密に言うと本当の「エンジン」部分は HTS (HMM/DNN-based Speech Synthesis System) で、OpenJTalk は HTS を使った日本語発音システム(含テキストアナライザー)になります。
最初に OpenJTalk を触り出した時は、今のように音声合成を積極的に用いている受肉系 VTuber やゆっくり解説なんてジャンルもなかったし「『Windows 標準搭載の音声読み上げ』『Text-To-Speech(Whisper)』や『AquesTalk』以外の何か」程度の紹介記事しか見かけませんでした。最近は音声合成についてのまとめ記事や Youtube 動画を見ているとちらほら登場していますね。あんまり受肉系 VTuber 界隈を知らないのでもっと活用されてるのかも。
そのほか Raspberry Pi にスタンドアロンで喋らせるとか、手軽に使えて良いシステムです。ビルドも簡単です。ソースコードの入手、ビルド、コマンドの使用方法についても触れている記事はいくつもあるので、ここでは割愛したいと思います。
個人的なメモ
次回触ってみる時に確実にやった事を忘れているので、メモしておきます。うひひ。
- hts_engine_API-1.10 を
make install
すると/usr/local/lib/libHTSEngine.a
にすっ飛んでゆかれました。 - hts_engine_API は 2019年4月にビルドした時から OpenJTalk が使用してるバージョンが変わってないみたい。HTS そのものは今年になってもバージョンが変わってそう?
- 今回 open_jtalk-1.10 から2018年にはリリースされていた -1.11 に変更。System に
make install
済み。それに伴い辞書も 1.11 に変更。辞書はコマンドラインオプション -x で都度呼び出し。 - バージョンがちょっと上がったけど生成される声に少し近くなった気がする?
- ボイスモデルは MMDAgent_Example-1.8.zip のメイ。
- 相変わらず、本家のデモで生成される音声とはちょっと違う気がする。パラメータ公開してくれないかなあ。
メイのビジュアル
今回初めて知ったんですが HTS ボイスモデルの女性声「メイ」ってビジュアルがあったんですねー。名古屋工業大学のマスコットキャラとのことで公式サイトもありました。双方向で会話ができる人だったのかー!
想像していた見た目とはちょっと違いました。もっとマリン船長のようなエ(ry _(:3」∠)_
# まあ大学発祥のキャラなので、こちらが正統派なんでしょうけどね。
5種類のボイスモデルをチューニングしてみた結果
で、肝心のチューニング結果が次の動画です。
次の原稿をそれぞれのボイスモデルで発声させています。
はじめまして。私の名前はメイです。このボイスは音声合成エンジンである、OpenJTalkのボイスモデルを使って生成されました。オープンソースプロダクトなので、Linux 環境でもビルドしてあげれば、自由に発音させることができます。有償の音声エンジンに比べたらまだまだですが、よろしくお願いします。
BGM を付けて声を軽くエコーさせたので、まるで色々なキャラがいる5人組アイドルユニットの挨拶みたいですね(苦笑)
バージョンが上がるたびに品質が良くなってる感じがします。ソースコードの中身はさっぱりで、コマンドラインオプションとして公開されているパラメータをいじる程度しかできませんが、OSS でこれほど聞ける音声が出てくれるのはとてもありがたい話です。
パラメーター
パラメーターとして open_jtalk
コマンドに与えられるオプションは次のとおりです。なお、読み上げさせたいテキストの入力は標準入力から与えます。
処理に関するパラメーター
-x /PATH/TO/DIR
- 辞書のディレクトリパスを指定する。
-m /PATH/TO/VOICE.htsvoice
- ボイスモデルファイルパスを指定する。
-ow /PATH/TO/OUTFILE.wav
- 出力ファイルパスを指定する。
音声合成に関するパラメーター
オプション | タイプ | 公式説明 | 省略時 | 最小 | 最大 |
-s | 整数 | sampling frequency | 自動 | 1 | |
-z | 整数 | audio buffer size (if i==0, turn off) | 0 | 0 | |
-p | 整数 | frame period (point) | 自動 | 1 | |
-u | 小数 | voiced/unvoiced threshold | 0.5 | 0.0 | 1.0 |
-b | 小数 | postfiltering coefficient | 0.0 | 0.0 | 1.0 |
-r | 小数 | speech speed rate | 1.0 | 0.0 | |
-jm | 小数 | weight of GV for spectrum | 1.0 | 0.0 | |
-a | 小数 | all-pass constant | 自動 | 0.0 | 1.0 |
-fm | 小数 | additional half-tone | 0.0 | ||
-jf | 小数 | weight of GV for log F0 | 1.0 | 0.0 |
最小・最大が空欄のオプションは特にレンジが決まってない模様。また、-fm は負数を取るようです。
指定したパラメーター
実際に用いたパラメーターをメモしておきます。手元では任意のテキストを流し込んだらそれぞれの声で出力してくれるスクリプトを書いてます。
共通パラメーター
オプション | 値 | 意味 | 考察 |
-s | 44100 | サンプルレート(周波数) | |
-z | 0 | バッファサイズ | |
-p | 220 | フレーム・ピリオド | ※ |
-u | 0.85 | 発声・無発声のしきい値 | 変な声が入る 0←→1 ガサガサ声 |
-b | 0.95 | 後処理フィルター係数 | ザラザラ 0←→1 なめらか |
-r | 1.1 | 発声速度 | 標準だとちょっと遅め |
-jm | 0.9 | 発声音量 |
※ 「数が小さいほどレイテンシー軽減、CPU負荷大。数が多いほどCPU負荷が減り、ノイズも改善。」らしい。
たまに入る不快なノイズは「フレーム・ピリオド」や「バッファサイズ」を調整したら改善しそうですね。あんまりサウンド関連の技術には明るくないので勉強が必要そう…今後もチューニングしていきます。
ボイスモデル毎の個別パラメーター
上記以外のパラメーターはボイスモデル毎に設定する方がしっくり来る音声になったので、個別指定しています。
Normal
オプション | 値 | 意味 | 考察 |
-a | 0.5 | 声質 | ヘリウムガス声 0←→1 オネエ声 |
-fm | 1.8 | ハーフトーン | 落ち着いた声 0←→1 裏声 |
-jf | 1.2 | 抑揚 |
一番使い勝手が良さそうな Normal。多分、辞書に「OpenJTalk」というキーワード・発音方法が登録されており、「オープンジェートーク」の「トー」の部分が高くなるのは好印象。(Normal に限らずすべてそういう発音をしています。)
Happy
オプション | 値 | 意味 | 考察 |
-a | 0.51 | 声質 | ヘリウムガス声 0←→1 オネエ声 |
-fm | -1.0 | ハーフトーン | 落ち着いた声 0←→1 裏声 |
-jf | 1.2 | 抑揚 |
声がちょっと不安定な印象なので今回 Happy はチューニングをしてません。喉をひねり潰したようなアニメ声って苦手なんです…。値は以前パラメーターをいじってみていた時のものをそのまま流用。声はもっと低くても良さそうです。
Bashful
オプション | 値 | 意味 | 考察 |
-a | 0.5 | 声質 | ヘリウムガス声 0←→1 オネエ声 |
-fm | -1.4 | ハーフトーン | 落ち着いた声 0←→1 裏声 |
-jf | 1.0 | 抑揚 |
恥かしがってる声です。モジモジしながら朗読をしている感じがしますね。つまづきながら発音していて流暢じゃないところが、かえって可愛いキャラを立てている気がします。ハーフトーンを負数にしないと声が安定せず、喉をひねり潰したようなアニメ声になりがち。
Angry
オプション | 値 | 意味 | 考察 |
-a | 0.49 | 声質 | ヘリウムガス声 0←→1 オネエ声 |
-fm | 1.8 | ハーフトーン | 落ち着いた声 0←→1 裏声 |
-jf | 1.2 | 抑揚 |
怒っている声です。もう少し低くすると真面目なシーン、例えば車載システムの警告アナウンスのようなシチュエーションに使えそうです。声も通りますね。
Sad
オプション | 値 | 意味 | 考察 |
-a | 0.5 | 声質 | ヘリウムガス声 0←→1 オネエ声 |
-fm | 1.2 | ハーフトーン | 落ち着いた声 0←→1 裏声 |
-jf | 1.8 | 抑揚 |
悲しんでる声です。テンションが低い声・弱気の声のように聞こえます。淡々と読み上げる感じが耳に付くことがなく、受肉(というか Youtube に上げる動画のナレーション)時の候補にしたい感じ。もうちょっと声を低くしても良いですね。
まとめ
それなりの知識があればソースコードを追っていけますが、まだまだ勉強不足です。発声がひっかかるのも、辞書を強化していけば改善するのかな。ソースコードを覗くより、まずは HTS/OpenJTalk についての論文や資料をちゃんと読む方が先かもしれません。(そのものについては情報少ない?)
- OpenJTalk の解析資料 … MeCab 拡張、njd についての解析
- 隠れマルコフモデルに基づく日本語音声合成ソフトウェア入門 … HMM 音声合成の概要
ぐぐっていて見つけたんだけど、2019年に書かれた「AIによる歌声合成はここまで来た!これこそ世界に誇るべき日本の先端技術」の記事で紹介されている AI 歌声合成、強烈ですね!
日本語のネイティブスピーカーじゃない外人でも、日本語の歌は(日本人が聴いても違和感がないくらい)上手に歌える例もあるため、会話よりも歌唱の方が敷居は低そうです。
また、リアルタイム生成の撮って出しではなく、ボカロのように人間によるポスト処理はがっつり入ってると思いますが…ここまで来たら人間と聞き分けできませんね。
知らないうちに未来来てるなぁ。
HTSは今年の3月にアプデされてますね。
OpenJTalkの商用版であるCeVIOトークはDNN音声合成を採用したCeVIO AIが
今年リリースされましたが、DNN版のOpenJTalkはまだデモも含めて公開されていないようです。
※hts_engine APIが DNN版HTS(v2.3.1)以降に対応していないようです。
OpenJTalkの日本語解析部分だけを利用して音声合成部分を独自に実装したフリーのDNN実装がいくつかでていますが(VOICEVOX等)、品質・合成速度面では問題がありますね。
実用的な速度にはGPU支援が前提になります。
商用版のCeVIO AIトークはCPUのみでかなり早く合成しますが、そこそこのCPUスペックを要求します。また初期のボイスと最新のボイスで品質に結構な差があります。
>>通りすがり
こんばんは、コメントありがとうございます!
HTS の公式に DNN の文言が追加されていましたね!深追いせずに前からある実装のパラメータをいじくりまわすのに夢中で CeVIO AI は知りませんでした。なるほどなるほど…。
僕の場合は(人の手による調整が許されない・合成速度が要求される・場合によってはハードウェア制限もある)リアルタイム発音というより、品質に対してある程度自由が効く「演者」としての利用が多くなりそうです。頂いたキーワードを基に GPU をガリガリ使った DNN 実装についても追っていきたいと思います。
OpenJTalk 界隈の最新情報を簡潔にまとめていただいて、とても勉強になりました。
[…] 上のコードでは openjtalk コマンドの引数が長くなるので省略しています。実行は、シェルから […]