はじめに
皆さんご無沙汰しております。FM cent. 水谷夏樹です。
今回は技術的な話をしたいと思います。
最近、VOICEVOXという音声合成ソフトを見つけ使い始めました。
かなり優秀なソフトがフリーソフト(コア部分はなんとOSS)として公開され、とても感謝しております。
とはいえ、まだまだ発展途上のソフトらしく、機能追加が追いついていない部分などもあるようです。
その中で、私も含めハマってしまう方が多いのでは?と感じた「単語登録が反映されない問題」について、暫定的な対処方法を試してみましたので、備忘録代わりに書き残しておきたいと思います。
単語登録が反映されない問題とは
単語登録前の挙動(例)
VOICEVOXのUIには、「読み方&アクセント辞書」メニューで、いわゆる単語登録機能が用意されています。
使い方はシンプルで、登録したい単語と読みがな(カタカナ)を入力し、アクセントをマウスで指定すればOKというものです。
例として、「武雄市(たけおし)若木町(わかきちょう)中山(なかやま)地区では」を読み上げさせたいと思います。
このように、わかきちょう→わかぎまち、なかやま→じゅうやま、と読みがつけられています。
このあたりはなんとなくですが、VOICEVOXというよりも、内部で日本語処理に使っているOpenJtalkあたりの挙動なのかな…と勝手に想像しております。
UIで単語登録してみる
単語登録に「優先度」?
この問題は、開発者の方も把握しておられます。
辞書登録した単語は、優先度によっては設定した読み方に反映されないことがあります。将来的に優先度を変更可能にすることでこの問題を解決できればと考えています。 #VOICEVOX
— VOICEVOX (@voicevox_pj) February 28, 2022
さて上のツイートにちらっと出てきた「優先度」とは何でしょうか。
この単語登録機能、実は上記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に戻ってみます。
今度はうまくいったようで、ちゃんと「ワカキチョオナカヤマ」となっていますね。
ただ、残念ながら「若木町中山」まで一つの単語として認識してしまっているようですので、そこは手動で調整する必要があります。
例えば「町」と「中」の間に読点や「の」を入れたり、アクセントのところで手動で区切り直したりして調整します。ここは原稿などの都合でよしなに。
上の例では「の」を入れるといい感じになりました。
いかがでしたでしょうか。
単語登録のコツがある?かも
- 長めの単語登録が可能であれば試してみる
- 優先度は最初から高くしない
というところに気をつけると良いかもしれません。
例えば、佐賀県に(玉ねぎやれんこんで有名な)「白石町(しろいしちょう)」という地名がありますが、普通に読ませると、これを「しらいしまち」と読んでしまいます。
これを単に「白石」だけで登録すると、例えば人名で「白石さん」を「しらいし」と読ませたい時にも「しろいし」と読んでしまうのであまり好ましく有りません。
そこで私の場合、単語登録で「白石町」を「シロイシチョオ」で登録しているのですが、同じように「白石平野」を「シロイシヘイヤ」、「白石警察署」を「シロイシケエサツショ」として単語登録をしています。
単語登録数は多くなってしまいますが、今のところこれで様子を見ている感じです。
まとめ
- 単語登録するときはUIのほうが簡単
- 単語登録がうまく反映されないときには、ブラウザから優先度を高くする
- 単語登録は可能であれば長めの単語で
となります。
この記事が、VOICEVOXの単語登録で困っている方のハードルを10cmでも下げられたらありがたいことと思います。