Fix: repeated punctuation bug

This commit is contained in:
litagin02
2024-02-08 16:50:08 +09:00
parent 233c02f059
commit 618d3e1626

View File

@@ -350,7 +350,8 @@ def text2sep_kata(norm_text: str) -> tuple[list[str], list[str]]:
(カタカナからなり、長音記号も含みうる、`アー` 等) (カタカナからなり、長音記号も含みうる、`アー` 等)
- `word`が`ー` から始まる → `ーラー` や `ーーー` など - `word`が`ー` から始まる → `ーラー` や `ーーー` など
- `word`が句読点や空白等 → `、` - `word`が句読点や空白等 → `、`
- `word`が`?` → ``(全角になる) - `word`がpunctuationの繰り返し → 全角にしたもの
基本的にpunctuationは1文字ずつ分かれるが、何故かある程度連続すると1つにまとまる。
他にも`word`が読めないキリル文字アラビア文字等が来ると`、`になるが、正規化でこの場合は起きないはず。 他にも`word`が読めないキリル文字アラビア文字等が来ると`、`になるが、正規化でこの場合は起きないはず。
また元のコードでは`yomi`が空白の場合の処理があったが、これは起きないはず。 また元のコードでは`yomi`が空白の場合の処理があったが、これは起きないはず。
処理すべきは`yomi`が`、`の場合のみのはず。 処理すべきは`yomi`が`、`の場合のみのはず。
@@ -358,14 +359,7 @@ def text2sep_kata(norm_text: str) -> tuple[list[str], list[str]]:
assert yomi != "", f"Empty yomi: {word}" assert yomi != "", f"Empty yomi: {word}"
if yomi == "": if yomi == "":
# wordは正規化されているので、`.`, `,`, `!`, `'`, `-`, `--` のいずれか # wordは正規化されているので、`.`, `,`, `!`, `'`, `-`, `--` のいずれか
if word not in ( if not set(word).issubset(set(punctuation)): # 記号繰り返しか判定
".",
",",
"!",
"'",
"-",
"--",
):
# ここはpyopenjtalkが読めない文字等のときに起こる # ここはpyopenjtalkが読めない文字等のときに起こる
raise ValueError(f"Cannot read: {word} in:\n{norm_text}") raise ValueError(f"Cannot read: {word} in:\n{norm_text}")
# yomiは元の記号のままに変更 # yomiは元の記号のままに変更
@@ -570,17 +564,16 @@ def kata2phoneme_list(text: str) -> list[str]:
""" """
原則カタカナの`text`を受け取り、それをそのままいじらずに音素記号のリストに変換。 原則カタカナの`text`を受け取り、それをそのままいじらずに音素記号のリストに変換。
注意点: 注意点:
- punctuationが来た場合punctuationが1文字の場合がありうる、処理せず1文字のリストを返す - punctuationかその繰り返しが来た場合punctuationたちをそのままリストにして返す
- 冒頭に続く「ー」はそのまま「ー」のままにする(`handle_long()`で処理される) - 冒頭に続く「ー」はそのまま「ー」のままにする(`handle_long()`で処理される)
- 文中の「ー」は前の音素記号の最後の音素記号に変換される。 - 文中の「ー」は前の音素記号の最後の音素記号に変換される。
例: 例:
`ーーソーナノカーー` → ["", "", "s", "o", "o", "n", "a", "n", "o", "k", "a", "a", "a"] `ーーソーナノカーー` → ["", "", "s", "o", "o", "n", "a", "n", "o", "k", "a", "a", "a"]
`?` → ["?"] `?` → ["?"]
`!?!?!?!?!` → ["!", "?", "!", "?", "!", "?", "!", "?", "!"]
""" """
if text in punctuation: if set(text).issubset(set(punctuation)):
return [text] return list(text)
elif text == "--":
return ["-", "-"]
# `text`がカタカナ(`ー`含む)のみからなるかどうかをチェック # `text`がカタカナ(`ー`含む)のみからなるかどうかをチェック
if re.fullmatch(r"[\u30A0-\u30FF]+", text) is None: if re.fullmatch(r"[\u30A0-\u30FF]+", text) is None:
raise ValueError(f"Input must be katakana only: {text}") raise ValueError(f"Input must be katakana only: {text}")