Skip to content

Latest commit

 

History

History
386 lines (293 loc) · 13.7 KB

File metadata and controls

386 lines (293 loc) · 13.7 KB

Phoneme Mapping Reference

Piper Plus の音素体系と ID マッピングのリファレンス。

アーキテクチャ

音素変換は Phonemizer ABC + 言語レジストリ で管理される。

テキスト → registry.get_phonemizer(language) → phonemize() → phoneme_ids → モデル
  • Phonemizer 抽象基底クラス (piper_plus_g2p/base.py)
  • 言語レジストリ (piper_plus_g2p/registry.py) に各言語が自動登録
  • Phonemizer ABC は phonemize()phonemize_with_prosody() を定義し、各言語サブクラスがこれを実装
  • get_phoneme_id_map()piper_plus_g2p/encode/id_maps.py のスタンドアロン関数
  • 音素列への BOS/EOS/パディング付与は piper_plus_g2p/encode/encoder.pyPiperEncoder クラス内部で処理される

日本語音素体系 (65トークン)

ソース: piper_plus_g2p/encode/id_maps.py, piper_plus_g2p/encode/pua.py

特殊トークン (10個)

ID トークン 用途
0 _ 短ポーズ / パディング
1 ^ 文頭 (BOS)
2 $ 文末・平叙文 (EOS)
3 ? 文末・疑問文 (汎用)
4 ?! 文末・強調疑問 (Issue #204)
5 ?. 文末・平叙疑問 (Issue #204)
6 ?~ 文末・確認疑問 (Issue #204)
7 # アクセント句境界
8 [ ピッチ上昇マーク
9 ] ピッチ下降マーク (アクセント核)

母音 (15個)

種類 音素 説明
有声母音 a i u e o 通常の母音
無声化母音 A I U E O 大文字で表記。例: です → d e s U
長母音 a: i: u: e: o: PUA マッピングで1文字化

撥音「ん」バリアント (5個) — Issue #207

後続音に応じて文脈依存の異音に変換される。

音素 条件
N 汎用 (後方互換用)
N_m m/b/p の前 (両唇音同化) さんぽ → s a N_m p o
N_n n/t/d/ts/ch の前 (歯茎音同化) あんない → a N_n n a i
N_ng k/g の前 (軟口蓋音同化) ぎんこう → g i N_ng k o o
N_uvular 語末・母音の前 (口蓋垂音) ほん → h o N_uvular

促音 (2個)

音素 説明
cl 促音 / 閉鎖
q 促音 (別表記)

子音 (33個)

分類 音素
破裂音 k ky kw g gy gw t ty d dy p py b by
破擦音・摩擦音 ch ts s sh z j zy f h hy v
鼻音・接近音 n ny m my r ry w y

PUA (Private Use Area) マッピング — 全96エントリ

複数文字音素を Unicode PUA (U+E000〜) の1コードポイントにマッピングし、内部で1文字として処理する。 固定割り当ては U+E000〜U+E061 の範囲で、U+E062 以降は動的割り当て用に予約されている。

ソース: piper_plus_g2p/encode/pua.pyFIXED_PUA_MAPPING

注意: PUA コードポイントは学習済みモデルに埋め込まれている。既存の割り当てを変更してはならない。

日本語 (JA) — 29エントリ

トークン PUA 説明
a: U+E000 長母音
i: U+E001 長母音
u: U+E002 長母音
e: U+E003 長母音
o: U+E004 長母音
cl U+E005 促音
ky U+E006 口蓋化子音
kw U+E007 唇音化子音
gy U+E008 口蓋化子音
gw U+E009 唇音化子音
ty U+E00A 口蓋化子音
dy U+E00B 口蓋化子音
py U+E00C 口蓋化子音
by U+E00D 口蓋化子音
ch U+E00E 破擦音
ts U+E00F 破擦音
sh U+E010 摩擦音
zy U+E011 摩擦音
hy U+E012 口蓋化子音
ny U+E013 鼻音
my U+E014 鼻音
ry U+E015 流音
?! U+E016 強調疑問マーカー (Issue #204)
?. U+E017 平叙疑問マーカー (Issue #204)
?~ U+E018 確認疑問マーカー (Issue #204)
N_m U+E019 撥音・両唇音同化 (Issue #207)
N_n U+E01A 撥音・歯茎音同化 (Issue #207)
N_ng U+E01B 撥音・軟口蓋音同化 (Issue #207)
N_uvular U+E01C 撥音・口蓋垂音 (Issue #207)

共有 (Shared) — 2エントリ

複数言語で共有されるトークン。

トークン PUA 説明
rr U+E01D 歯茎ふるえ音 (ES スペイン語の巻き舌 r)
y_vowel U+E01E 円唇前舌狭母音 [y] (ZH ピンイン ü / FR lune)

U+E01F は未使用 (予約ギャップ)。

中国語 (ZH) — 43エントリ

ソース: piper_plus_g2p/chinese.py, chinese_phonemize.cpp

声母 (Initials) — 有気音・破擦音 (8エントリ)

トークン PUA 説明
U+E020 有気両唇破裂音 (ピンイン p)
U+E021 有気歯茎破裂音 (ピンイン t)
U+E022 有気軟口蓋破裂音 (ピンイン k)
U+E023 歯茎硬口蓋破擦音 (ピンイン j)
tɕʰ U+E024 有気歯茎硬口蓋破擦音 (ピンイン q)
U+E025 そり舌破擦音 (ピンイン zh)
tʂʰ U+E026 有気そり舌破擦音 (ピンイン ch)
tsʰ U+E027 有気歯茎破擦音 (ピンイン c)

ɕ (U+0255), ʂ (U+0282), ɻ (U+027B) は単一コードポイントのため PUA 不要。

二重母音 (Diphthongs) — 4エントリ

トークン PUA 説明
U+E028 (ピンイン ai)
U+E029 (ピンイン ei)
U+E02A (ピンイン ao)
U+E02B (ピンイン ou)

鼻音韻尾 (Nasal finals) — 5エントリ

トークン PUA 説明
an U+E02C (ピンイン an)
ən U+E02D (ピンイン en)
U+E02E (ピンイン ang)
əŋ U+E02F (ピンイン eng)
U+E030 (ピンイン ong)

i 系複合韻母 (齐齿呼) — 9エントリ

トークン PUA 説明
ia U+E031 (ピンイン ia/ya)
U+E032 (ピンイン ie/ye)
iou U+E033 (ピンイン iu/you)
iaʊ U+E034 (ピンイン iao/yao)
iɛn U+E035 (ピンイン ian/yan)
in U+E036 (ピンイン in/yin)
iaŋ U+E037 (ピンイン iang/yang)
U+E038 (ピンイン ing/ying)
iuŋ U+E039 (ピンイン iong/yong)

u 系複合韻母 (合口呼) — 8エントリ

トークン PUA 説明
ua U+E03A (ピンイン ua/wa)
uo U+E03B (ピンイン uo/wo)
uaɪ U+E03C (ピンイン uai/wai)
ueɪ U+E03D (ピンイン ui/wei)
uan U+E03E (ピンイン uan/wan)
uən U+E03F (ピンイン un/wen)
uaŋ U+E040 (ピンイン uang/wang)
uəŋ U+E041 (ピンイン ueng/weng)

注意: ü 系は共有トークン y_vowel (U+E01E) を基本母音として使用する。

ü 系複合韻母 (撮口呼) — 3エントリ

トークン PUA 説明
U+E042 (ピンイン üe/yue)
yɛn U+E043 (ピンイン üan/yuan)
yn U+E044 (ピンイン ün/yun)

成節子音 (Syllabic consonants) — 1エントリ

トークン PUA 説明
ɻ̩ U+E045 成節そり舌音 (zhi/chi/shi/ri の韻母)

ɨ (U+0268) は単一コードポイントのため PUA 不要。

声調マーカー (Tones) — 5エントリ

トークン PUA 説明
tone1 U+E046 阴平 (高平調)
tone2 U+E047 阳平 (上昇調)
tone3 U+E048 上声 (低下上昇調)
tone4 U+E049 去声 (下降調)
tone5 U+E04A 轻声 (軽声)

韓国語 (KO) — 8エントリ

ソース: piper_plus_g2p/korean.py, korean_phonemize.cpp

pʰ/tʰ/kʰ/tɕ/tɕʰ は ZH と共有 (同一 PUA コードポイント)。

濃音 (Tense consonants / 경음) — 5エントリ

トークン PUA 説明
U+E04B 濃音両唇破裂音 (ㅃ)
U+E04C 濃音歯茎破裂音 (ㄸ)
U+E04D 濃音軟口蓋破裂音 (ㄲ)
U+E04E 濃音歯擦音 (ㅆ)
t͈ɕ U+E04F 濃音歯茎硬口蓋破擦音 (ㅉ)

内破音 (Unreleased finals / 내파음) — 3エントリ

トークン PUA 説明
U+E050 内破軟口蓋音
U+E051 内破歯茎音
U+E052 内破両唇音

U+E053 は未使用 (予約ギャップ)。

スペイン語/ポルトガル語 (ES/PT) — 2エントリ

ソース: piper_plus_g2p/spanish.py, piper_plus_g2p/portuguese.py

トークン PUA 説明
U+E054 無声後部歯茎破擦音 (ES ch / PT 口蓋化 t)
U+E055 有声後部歯茎破擦音 (EN JH / PT 口蓋化 d)

フランス語 (FR) — 3エントリ

ソース: piper_plus_g2p/french.py, french_phonemize.cpp

トークン PUA 説明
ɛ̃ U+E056 鼻母音・非円唇前舌半広母音 (vin, pain)
ɑ̃ U+E057 鼻母音・非円唇後舌広母音 (France, temps)
ɔ̃ U+E058 鼻母音・円唇後舌半広母音 (bon, nom)

スウェーデン語 (SV) — 9エントリ

ソース: piper_plus_g2p/swedish.py

スウェーデン語の長母音は Complementary Quantity (相補的長短) に基づき、ストレスのある開音節で長母音が出現する。各長母音は2コードポイント (母音 + ː) のため PUA マッピングが必要。

トークン PUA 説明
U+E059 非円唇前舌狭長母音 (例: vi, liten)
U+E05A 円唇前舌狭長母音 (例: ny, syster)
U+E05B 非円唇前舌半狭長母音 (例: se, leva)
ɛː U+E05C 非円唇前舌半広長母音 (例: häl, läsa — ä の長音)
øː U+E05D 円唇前舌半狭長母音 (例: öl, söka — ö の長音)
ɑː U+E05E 非円唇後舌広長母音 (例: far, tala — a の長音)
U+E05F 円唇後舌半狭長母音 (例: mor, lov — å の長音, o 例外語)
U+E060 円唇後舌狭長母音 (例: o のデフォルト長音, hus)
ʉː U+E061 円唇中舌狭長母音 (例: hus, ljus — u の長音)

割り当て範囲まとめ

範囲 用途
U+E000〜U+E01C 日本語 (JA) — 29エントリ
U+E01D〜U+E01E 共有 (Shared) — 2エントリ
U+E01F 未使用 (予約ギャップ)
U+E020〜U+E04A 中国語 (ZH) — 43エントリ
U+E04B〜U+E052 韓国語 (KO) — 8エントリ
U+E053 未使用 (予約ギャップ)
U+E054〜U+E055 スペイン語/ポルトガル語 (ES/PT) — 2エントリ
U+E056〜U+E058 フランス語 (FR) — 3エントリ
U+E059〜U+E061 スウェーデン語 (SV) — 9エントリ
U+E062〜 動的割り当て用 (予約)

英語音素体系

ソース: piper_plus_g2p/english.py G2P エンジン: g2p-en (Apache-2.0) — espeak-ng (GPL) 不要

ARPAbet → IPA 変換表

ARPAbet IPA ARPAbet IPA
AA ɑ N n
AE æ NG ŋ
AH ʌ (stress>0), ə (stress=0) OW
AO ɔː OY ɔɪ
AW P p
AY R ɹ
B b S s
CH SH ʃ
D d T t
DH ð TH θ
EH ɛ UH ʊ
ER ɚ (stress=0), ɜː (stress=1) UW
EY V v
F f W w
G ɡ Y j
HH h Z z
IH ɪ ZH ʒ
IY
JH
K k
L l
M m

文脈依存規則

パターン 変換
AA + R ɑːɹ car → kɑːɹ
ER (stress=1) ɜː bird → bɜːd
AH (stress=0) ə about → əbaʊt

ストレスマーカー

記号 意味
ˈ 第1ストレス (母音の前に挿入)
ˌ 第2ストレス (母音の前に挿入)

機能語 (a, the, are, you 等 75語) はストレスが自動除去される。

英語の後処理 (post_process_ids)

英語では espeak-ng 互換のため、EnglishPhonemizer.post_process_ids() が以下を行う:

  1. 各音素 ID の間にパディング (_, ID=0) を挿入
  2. 先頭に BOS (^) + パディング を付加
  3. 末尾に EOS ($) を付加

日本語ではこの後処理は行われない (音素列がそのまま使用される)。


Prosody Features (A1/A2/A3)

両言語で ProsodyInfo(a1, a2, a3) を生成するが、意味が異なる。

フィールド 日本語 英語
a1 アクセント核からの相対位置 固定 0
a2 アクセント句内のモーラ位置 (1-based) ストレスレベル (0=なし, 1=第2, 2=第1)
a3 アクセント句内の総モーラ数 単語内の音素数

音素 ID マッピングの仕組み

  1. テキストを registry.get_phonemizer(language) で音素列に変換
  2. 複数文字音素を PUA コードポイントにマッピング (piper_plus_g2p/encode/pua.py)
  3. phoneme_id_map (config.json 由来) で各音素を ID に変換
  4. post_process_ids() で言語固有の後処理 (英語: BOS/EOS/パディング)
  5. ID 列をモデルに入力

日本語の phoneme_id_mappiper_plus_g2p/encode/id_maps.py で自動生成される。 英語は学習済みモデルの config.json に含まれる phoneme_id_map を使用する。