[VOICEVOX] 単語登録が反映されない場合の暫定対処法について実験してみた。

この記事は約10分で読めます。
この記事は本家VOICEVOX対応完了までの暫定的なものでした。最新のバージョンではUIに優先度設定が組み込まれていますので、設定方法についてはVOICEVOXのUIをご利用下さい。考え方についてはもしかしたらまだ参考になるかもしれません。

はじめに

皆さんご無沙汰しております。FM cent. 水谷夏樹です。
今回は技術的な話をしたいと思います。
最近、VOICEVOXという音声合成ソフトを見つけ使い始めました。

VOICEVOX | 無料のテキスト読み上げ・歌声合成ソフトウェア
無料で使える中品質なテキスト読み上げ・歌声合成ソフトウェア。商用・非商用問わず無料で、誰でも簡単にお使いいただけます。イントネーションを詳細に調整することも可能です。
#使用に至る経緯は、先にYouTubeにあげた動画と関連するため、改めて記事に起こすつもりです。しばしお待ちを。

かなり優秀なソフトがフリーソフト(コア部分はなんとOSS)として公開され、とても感謝しております。
とはいえ、まだまだ発展途上のソフトらしく、機能追加が追いついていない部分などもあるようです。

その中で、私も含めハマってしまう方が多いのでは?と感じた「単語登録が反映されない問題」について、暫定的な対処方法を試してみましたので、備忘録代わりに書き残しておきたいと思います。

#今風にするなら「解説動画」にすべきなのでしょうが、そこまでの環境と技量がありませんので、ひとまずブログ記事でご勘弁ください…

単語登録が反映されない問題とは

単語登録前の挙動(例)

VOICEVOXのUIには、「読み方&アクセント辞書」メニューで、いわゆる単語登録機能が用意されています。

使い方はシンプルで、登録したい単語と読みがな(カタカナ)を入力し、アクセントをマウスで指定すればOKというものです。

例として、「武雄市(たけおし)若木町(わかきちょう)中山(なかやま)地区では」を読み上げさせたいと思います。

このように、わかきちょう→わかぎまち、なかやま→じゅうやま、と読みがつけられています。

このあたりはなんとなくですが、VOICEVOXというよりも、内部で日本語処理に使っているOpenJtalkあたりの挙動なのかな…と勝手に想像しております。

#OpenJtalkのデモで試してみると、「たけおしわかぎまちちゅうざんちく」と読んでいます。ただし、町と中の間に読点(、)を入れると、どちらも後半は「なかやまちく」と読んでくれます。

UIで単語登録してみる

続いて、「若木町」をUIで単語登録してみたいと思います。
画面上部のメニューバーから「設定」→「読み方&アクセント辞書」の順にクリックします。
画面左側に単語一覧が出てきます。
新しい単語を登録したい場合は「追加」、すでにある単語を修正したい場合は「編集」をクリックします。
画面右側に単語登録・編集画面が出てきます。
単語は漢字かな交じりで、読みはカタカナで入力します。
例えば「若木町」の場合、文でかくときは「わかきちょ」ですが、読みには「ワカキチョ」と、発音に合わせた書き方にすることも、地味に重要なポイントです。
最後にアクセント調整です。アクセントの山が落ちる直前の文字をクリックします。例えば「武雄市」の場合だと「タケシ」の「オ」を選択します。
修正・登録が終わったら「保存」をクリックします。
なお、元のデータから変更されていない場合は「保存」がクリックできませんので、「キャンセル」をクリックします。
元の画面に戻るにはさらに、右上の「✕」印をクリックします。
さて、ここまで登録して試してみましたが、読み上げはやはり変わらず「ワカギマチジュウヤマ」のままです。
もちろん読み上げる文脈や句読点の位置などによっては、登録が効いている場合もあるため、ちゃんと登録したはずなのになぜ?となってしまう方が少なくないのかな、と推測します。

単語登録に「優先度」?

この問題は、開発者の方も把握しておられます。

さて上のツイートにちらっと出てきた「優先度」とは何でしょうか。

この単語登録機能、実は上記UIに現れていない項目が少なくとも2つあるようです。優先度と品詞です。

品詞(固有名詞、動詞、形容詞…など)は皆さん学生時代の国語で習ったと思いますのでサクッと省略しますが、問題は「優先度」です。

どうやら、優先度を上げればその単語が出てきた場合に、内蔵辞書の解析に優先して、その単語を登録した読み・アクセントで読んでくれそうです。

 

暫定的な解決方法について

優先度の設定

これはVOICEVOXのエンジンに直接アクセスすることで使えるようですが、APIを直接叩ける方ばかりではないと思いますので、(多分この記事を探しに来た方はそうでしょう)、エンジンで動いているHTTPサーバを見に行くのが簡単かと。

ブラウザを開き、VOICEVOXエンジンにアクセスする

VOICEVOXが動いている端末(PC)上でなにかしらブラウザ(Edge/Chrome/Safariなど)を開き、以下のアドレスにアクセスします。

今流行のhttpsではなくhttpであること、/docsまでつけることをお忘れなく。うまくいけば、以下のような画面が表示されるはずです。

登録した単語を探し出す

それでは、先程UIから登録した「若木町」の単語登録データを探してみましょう。

少し下の方にスクロールすると、「ユーザー辞書」の項目が見つかります。

一番上にある「[GET] /user_dict」の行をクリックします。詳細画面が下に開きます。

Parametersの右側にある「Try It Out」をクリックすると、すぐ下に「Execute」のボタンが表示されますので、クリックしてみます。

すると、サーバからの出力がテキストで表示されます。

「200」と表示のある行の右側に、大きなテキストボックスがあるかと思います。ここにVOICEVOXのユーザ辞書に登録されているデータが、項目名のアルファベットとともに表示されます。

単語登録が1個であれば、登録した単語のデータはすぐわかると思いますが、私のように山ほどの単語を登録すると、探し出すのも一苦労になってしまいます。

そこでブラウザの検索機能を使って探します。例えば[CTRL](Macだとコマンドキー)を押しながら[F]を押すと、画面のどこかに検索窓が表示されることが多いです。Edgeの場合は画面上部に出てきました。

検索窓に「若木町」と入れて[Enter]を押すと、「若木町」のところが色が反転して表示されますので、その1行上からのかたまりをチェックします。ここでメモが必要な項目は以下の4つです。

  • word_uuid … 単語の1行上、”と”の間に挟まっているアルファベットと数字の長い羅列です。

    これが単語ごとに内部で割り振られているIDになります。1文字でも間違うと変更作業ができませんので、コピペでメモ帳にでも貼り付けておきましょう。
  • surface … UI上では「単語」にあたります。先程検索した結果の部分ですね。
  • pronunciation … UI上では「読み」にあたります。
  • accent_type … アクセントの位置です。UIでは見た目で分かる表示でしたが、この画面では数字になっています。見た感じ「頭から何文字目」の数字のようで(ただし「キャ」とかだと2文字ではなく1文字とカウントする模様)、特段設定されていない場合は「0」になっているようです。

ちなみに、「surface」の下の行にある「priority」が優先度の数字になります。通常(特段設定を変更してなければ)、「5」になっているようです。

単語登録の変更を行う

それでは、いよいよ優先度の変更です。画面をさらに下にスクロールすると、下の4つの行が見えるかと思います。

オレンジ色の「[PUT] /user_dict_word/{word_uuid}」の行をクリックします。詳細画面が下に開きます。

Parametersの右側にある「Try It Out」をクリックすると、その下の設定項目が入力できるようになります。

先にメモしておいた4つの項目(word_uuid、surface、pronunciation、accent_type)を入力していきます。

その下にある「word_type」は、必要に応じて変更します。この画面の少し上(1つ前のスクショを参照のこと)にも記載がありますが、

  • PROPER_NOUN … 固有名詞
  • COMMON_NOUN … 普通名詞
  • VERB … 動詞
  • ADJECTIVE … 形容詞
  • SUFFIX … 語尾

となっています。おそらく単語登録が必要な場合の多くが、地名・人名・施設名等だと思いますので、既定の「PROPER_NOUN」で良いでしょう。

 

さて、お待たせしました。

最後の「priority」が、今回の一番肝となる「優先度」の項目です。先程書いたように、特に触ってなければ既定の「5」になっているはずです。

まずはこの数字を「7」にして試してみます。数字を変更し、下にある「Execute」をクリックします。すると、下の方に結果が表示されます。

上の例のように、「Server Response」の下にある「Code」の数字が「204」であれば、書き換え処理は成功しています。

早速UIに戻って試してみましょう。

残念、変わらなかったようです。
それでは、先程の画面に戻って、優先度を「9」にしてみましょう。

書き換え処理が成功したのを確認して、再度UIに戻ってみます。

今度はうまくいったようで、ちゃんと「ワカキチョオナカヤマ」となっていますね。

ただ、残念ながら「若木町中山」まで一つの単語として認識してしまっているようですので、そこは手動で調整する必要があります。

例えば「町」と「中」の間に読点や「の」を入れたり、アクセントのところで手動で区切り直したりして調整します。ここは原稿などの都合でよしなに。

上の例では「の」を入れるといい感じになりました。
いかがでしたでしょうか。

単語登録のコツがある?かも

ちょっと脱線しますが、A.I.VOICEさんのドキュメントに、興味深い記載がありました。
ユーザー辞書について — A.I.VOICE Editor 1.4.9 ドキュメント
VOICEVOXの場合はフレーズ登録という機能はありませんので、
  • 長めの単語登録が可能であれば試してみる
  • 優先度は最初から高くしない

というところに気をつけると良いかもしれません。

例えば、佐賀県に(玉ねぎやれんこんで有名な)「白石町(しろいしちょう)」という地名がありますが、普通に読ませると、これを「しらいしまち」と読んでしまいます。

これを単に「白石」だけで登録すると、例えば人名で「白石さん」を「しらいし」と読ませたい時にも「しろいし」と読んでしまうのであまり好ましく有りません。

そこで私の場合、単語登録で「白石町」を「シロイシチョオ」で登録しているのですが、同じように「白石平野」を「シロイシヘイヤ」、「白石警察署」を「シロイシケエサツショ」として単語登録をしています。

単語登録数は多くなってしまいますが、今のところこれで様子を見ている感じです。

 

まとめ

以上まとめますと、
  1. 単語登録するときはUIのほうが簡単
  2. 単語登録がうまく反映されないときには、ブラウザから優先度を高くする
  3. 単語登録は可能であれば長めの単語で

となります。

この記事が、VOICEVOXの単語登録で困っている方のハードルを10cmでも下げられたらありがたいことと思います。

おまけ

YouTubeにて、VOICEVOXをつかった作品?をいくつかアップしております。
VOICEVOXの声でラジオのあのコーナーを喋らせたら、というちょっとニッチなジャンルではありますが、よろしければどうぞ。
FM cent.
作成した動画を友だち、家族、世界中の人たちと共有
以上ここまでのお相手は、FM cent. 水谷夏樹でした。では、また。
タイトルとURLをコピーしました