njdの解説 - WariHima/pyopenjtalk-mod GitHub Wiki

njdの解説

njd が何の略なのはか不明(Naist J Dicの略?)。

以下の文章は解析資料から抜粋
https://www.negi.moe/negitalk/openjtalk.html

njd には以下の処理コードが存在します。基本的には、日本語の暗黙のルールをコード化処理するものです。

1 njd_set_pronunciation … 意味のない(辞書にない)仮名やアルファベットの読みを生成
2 njd_set_digit … 二桁以上の数字や助数詞、単位の読みを生成
3 njd_set_accent_phrase … 品詞によるアクセントの結合処理
4 njd_set_accent_type … タイプによるアクセントの結合処理
5 njd_set_unvoiced_vowel … 無声音化を処理
6 njd_set_long_vowel … 長音化処理
1.によって「TIF」を「ティーアイエフ」と発音できるようになります。「ティフ」と発音させるには、MeCab への辞書登録が必要です。
2.によって「3939」が「さんきゅうさんきゅう」から「さんぜんきゅうひゃくさんじゅうきゅう」に変換されます。
6.によって、「エイ」を「エー」に変換するなど、「イ」で終わる一部の読みが長音化されます。

5.無声音化

njd_set_unvoiced_vowel_rule_*.h のコメントによると
無声子音: k ky s sh t ty ch ts h f hy p py
Rule 1 助動詞の「です」と「ます」の「す」が無声化
Rule 2 続けて無声化しない
Rule 3 アクセント核で無声化しない
Rule 4 無声子音(k ky s sh t ty ch ts h f hy p py)に囲まれた「i」と「u」が無声化

という処理になっています。無声音化に関しては「これで完璧」というルールは存在しません。
njd として実装される処理はどれも「実際に使われてる日本語から法則を(日本語研究者が)ひねり出した例が元」なので、違う考え、違う処理も十分あり得る領域になります。

3.アクセントの結合処理

3.の njd_set_accent_phrase_rule_*.h のコメントに書かれたルールを見てみると
Rule 01 デフォルトはくっつける
Rule 02 「名詞」の連続はくっつける
Rule 03 「形容詞」の後に「名詞」がきたら別のアクセント句に
Rule 04 「名詞,形容動詞語幹」の後に「名詞」がきたら別のアクセント句に
Rule 05 「動詞」の後に「形容詞」or「名詞」がきたら別のアクセント句に
Rule 06 「副詞」,「接続詞」,「連体詞」は単独のアクセント句に
Rule 07 「名詞,副詞可能」(すべて,など)は単独のアクセント句に
Rule 08 「助詞」or「助動詞」(付属語)は前にくっつける
Rule 09 「助詞」or「助動詞」(付属語)の後の「助詞」,「助動詞」以外(自立語)は別のアクセント句に
Rule 10 「*,接尾」の後の「名詞」は別のアクセント句に
Rule 11 「形容詞,非自立」は「動詞,連用*」or「形容詞,連用*」or「助詞,接続助詞,て」or「助詞,接続助詞,で」に接続する場合に前にくっつける
Rule 12 「動詞,非自立」は「動詞,連用*」or「名詞,サ変接続」or「助詞,接続助詞,て」or「助詞,接続助詞,で」に接続する場合に前にくっつける
Rule 13 「記号」は単独のアクセント句に
となってます。単語毎にアクセントを付けるのではなく、できるだけ長いひと固まり(アクセント句)にアクセントを付けることで、全体の抑揚として表現できるようにしよう、ということです。たとえば Rule 02 は「複数の名詞が連続したら、それは一つの複合名詞にしよう」ということです。

では、結合したら、どこにアクセントを付けるのでしょうか。それを解決するのが 4. です。これは
匂坂芳典,佐藤大和「日本語単語連鎖のアクセント規則」電子通信学会論文誌 vol.J66-D, no.7, pp.847–856, 1983
という論文に基づいているものと思われます。
私は現物を見てないのですが、その内容を紹介してる別の論文で確認しています。そして、この処理で必要になるのが、先の MeCab の項で説明した「追加されたアクセント関連情報」のうちの 2 つ目の項です。
たとえば先の「歌う」の場合「C2」ですが、この「C2」は「後続語が 2 モーラ以上で、かつアクセント核を持たない、あるいは最終音節内に核を持つ場合は結合し、その際、先行語のアクセント核が消え、後続要素の先頭モーラにアクセント核がくる」タイプということになります。
詳細は論文を見て下さい。

ただ njd_set_accent_type.c を見ると「C2 は無条件で後続要素の先頭モーラにアクセント核がくる」実装になっているようです。

ちなみに、「追加されたアクセント関連情報」の最初の方は、「<アクセント核>/<モーラ数>」です。なお、私が使ったバージョンの辞書には「モーラ数が実際と一致してないもの」がありました(辞書のバグ)。

⚠️ **GitHub.com Fallback** ⚠️