    def text2sep_kata(self, parsed) -> tuple[list[str], list[str]]:
        """
        `text_normalize`で正規化済みの`norm_text`を受け取り、それを単語分割し、
        分割された単語リストとその読み（カタカナor記号1文字）のリストのタプルを返す。
        単語分割結果は、`g2p()`の`word2ph`で1文字あたりに割り振る音素記号の数を決めるために使う。
        例:
        `私はそう思う!って感じ?` →
        ["私", "は", "そう", "思う", "!", "って", "感じ", "?"], ["ワタシ", "ワ", "ソー", "オモウ", "!", "ッテ", "カンジ", "?"]
        """
        # parsed: OpenJTalkの解析結果
        sep_text: list[str] = []
        sep_kata: list[str] = []
        fix_parsed = []
        i = 0
        while i <= len(parsed) - 1:
            # word: 実際の単語の文字列
            # yomi: その読み、但し無声化サインの`’`は除去
            # print(parsed)
            yomi = parsed[i]["pron"]
            tmp_parsed = parsed[i]
            if i != len(parsed) - 1 and parsed[i + 1]["string"] in [
                "々",
                "ゝ",
                "ヽ",
                "ゞ",
                "ヾ",
                "゛",
            ]:
                word = parsed[i]["string"] + parsed[i + 1]["string"]
                i += 1
            else:
                word = parsed[i]["string"]
            word, yomi = replace_punctuation(word), yomi.replace("’", "")
            """
            ここで`yomi`の取りうる値は以下の通りのはず。
            - `word`が通常単語 → 通常の読み（カタカナ）
                （カタカナからなり、長音記号も含みうる、`アー` 等）
            - `word`が`ー` から始まる → `ーラー` や `ーーー` など
            - `word`が句読点や空白等 → `、`
            - `word`が`?` → `？`（全角になる）
            他にも`word`が読めないキリル文字アラビア文字等が来ると`、`になるが、正規化でこの場合は起きないはず。
            また元のコードでは`yomi`が空白の場合の処理があったが、これは起きないはず。
            処理すべきは`yomi`が`、`の場合のみのはず。
            """
            assert yomi != "", f"Empty yomi: {word}"
            if yomi == "、":
                # wordは正規化されているので、`.`, `,`, `!`, `'`, `-`のいずれか
                if word not in (
                    ".",
                    ",",
                    "!",
                    "'",
                    "-",
                    "?",
                    ":",
                    ";",
                    "…",
                    "",
                ):
                    # ここはpyopenjtalkが読めない文字等のときに起こる
                    print(
                        "Cannot read:{}, yomi:{}, new_word:{};".format(
                            word, yomi, self.japan_JH2K.convert(word)[0]["kana"]
                        )
                    )
                    # raise ValueError(word)
                    word = self.japan_JH2K.convert(word)[0]["kana"]
                    # print(word, self.japan_JH2K.convert(word)[0]['kana'], kata2phoneme_list(self.japan_JH2K.convert(word)[0]['kana']))
                    tmp_parsed["pron"] = word
                    # yomi = "-"
                    # word = ','
                # yomiは元の記号のままに変更
                # else:
                #     parsed[i]['pron'] = parsed[i]["string"]
                yomi = word
            elif yomi == "？":
                assert word == "?", f"yomi `？` comes from: {word}"
                yomi = "?"
            if word == "":
                i += 1
                continue
            sep_text.append(word)
            sep_kata.append(yomi)
            # print(word, yomi, parts)
            fix_parsed.append(tmp_parsed)
            i += 1
        # print(sep_text, sep_kata)
        return sep_text, sep_kata, fix_parsed
`text_normalize`で正規化済みの`norm_text`を受け取り、それを単語分割し、
分割された単語リストとその読み（カタカナor記号1文字）のリストのタプルを返す。
単語分割結果は、`g2p()`の`word2ph`で1文字あたりに割り振る音素記号の数を決めるために使う。
例:
`私はそう思う!って感じ?` →
["私", "は", "そう", "思う", "!", "って", "感じ", "?"], ["ワタシ", "ワ", "ソー", "オモウ", "!", "ッテ", "カンジ", "?"]
models/tts/maskgct/g2p/g2p/japanese.py