def apply_replacements(text, replacements):
    """置換辞書を使ってテキストを置換（大文字小文字無視）"""
    for key, val in replacements.items():
        text = re.sub(key, val, text, flags=re.IGNORECASE)
    return text

def normalize_speaker(speaker):
    if speaker is None: return None

# style付きのspeakerに対応
    if '（' in speaker:
        speaker_list = speaker.split('（')
        return speaker_list[0]

# '(', ')'をreplace.pyで' 'に変換してしまう問題に対応    
    if ' ' in speaker:
        speaker_list = speaker.split(' ')
        return speaker_list[0]

    return speaker

def split_dialogue(dialogue, target_voices, speakers = {}, default_voice = None, is_monologue = True):
# target_voicesが文字列型の場合は、voiceは決め打ち
    if type(target_voices) is str: 
        force_voice = target_voices
    else:
        force_voice = None

# speaker_section is Noneの場合は、spekar情報はtextから拾う
    speaker_section, text = dialogue

#    lines = [text]
#    lines = re.split(r'[。．\n]', text)
    lines = text.split('\n')
    dialogue_list = []

    current_speaker = normalize_speaker(speaker_section)
    for _line in lines:
        if _line == "": continue

        print(f"  original: current_speaker: {current_speaker}: text [{_line[:30]}]")
        if not is_monologue and ',' in _line:
# 対話の場合, _lineからspearkerをひろう
#            print()
            speaker, line = _line.split(',', 1)
        else:
# 独話の場合
            speaker, line = speaker_section, _line

# speakerとvoiceの解析。まずspeaker名からstyleを削除
        if speaker: speaker = normalize_speaker(speaker)

# target_voicesリストにseakerがあるか
        if force_voice:
            speaker = normalize_speaker(force_voice)
        else:
            speaker = target_voices.get(speaker, None)
            if speaker is None and current_speaker:
# target_voicesリストにseakerが無い場合はcurrent_speakerを使う
                speaker = current_speaker

            speaker = target_voices.get(speaker, None)
            if speaker is None:
                speaker = target_voices.get(0, None)
                if not speaker: speaker = default_voice

            if speaker: speaker = normalize_speaker(speaker)
#        print("  => voice:", speaker)

        dialogue_list.append((speaker, line))
        current_speaker = speaker

    return dialogue_list
