import requests
import json
import re
import os
import time
from pathlib import Path

# 创建输出目录
Path("audio/momo").mkdir(parents=True, exist_ok=True)
Path("audio/minimax").mkdir(parents=True, exist_ok=True)

# API配置
MOMO_API_URL = "http://api-moai.momo.com/api/v1/audio/speech"
MOMO_API_KEY = "60B3833C7520E29EC31FF137CD2A7CA312F8C13A70631FEF7CA1B8C4B206A0E8"

MINIMAX_GROUP_ID = "1939611624583205312"
MINIMAX_API_KEY = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJHcm91cE5hbWUiOiJDbGF5dG9uIENoZW4iLCJVc2VyTmFtZSI6IkNsYXl0b24gQ2hlbiIsIkFjY291bnQiOiIiLCJTdWJqZWN0SUQiOiIxOTM5NjExNjI0NTg3Mzk5NjE2IiwiUGhvbmUiOiIiLCJHcm91cElEIjoiMTkzOTYxMTYyNDU4MzIwNTMxMiIsIlBhZ2VOYW1lIjoiIiwiTWFpbCI6ImFsY2hlbXlvZmNvZGVAZ21haWwuY29tIiwiQ3JlYXRlVGltZSI6IjIwMjUtMDctMDIgMTM6NDg6MzEiLCJUb2tlblR5cGUiOjEsImlzcyI6Im1pbmltYXgifQ.tYnA_TmzkpvEK2jPby1Q5TXG6jIDxZu85-F4huTNQC2LqRHvRTsFBaeJD1GSMvW3gPb48VI5eFkHSDv6YdCAyqwADSnhbrVgyJs_kKGRrw0bhJPBdz-08BSx4vd-J9i2WS1Uv0n730SUhvnMEFv-XGh-pj5Vz9c0dA3Q6BMKulO2MTzyFeftK9X-1FVcWs6G5glBwQYnzKFmT3eKi5e3qkQcfvj3IBstMTQrPO5BVsrj8X4Z6cfQ6McbzueeGQrdf7vlq-Pdi9DP2i4tp4FEWhIl4Rap1izVRQUa69KWD-q2FNTIDPCS5QQYvYFQMaHjQmJet4Zh9tV4fEdQslqEMw"
MINIMAX_API_URL = f"https://api.minimax.io/v1/t2a_v2?GroupId={MINIMAX_GROUP_ID}"


def extract_sentences_from_md(file_path):
    """从markdown文件中提取所有句子"""
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()
    
    sentences = []
    lines = content.split('\n')
    
    current_part = ""
    for line in lines:
        line = line.strip()
        if not line:
            continue
            
        # 检测章节标题
        if line.startswith('パート') or line.startswith('**パート'):
            current_part = re.sub(r'\*\*|\【|\】', '', line)
            continue
        
        # 提取日语句子（包含モン的句子）
        if 'モン' in line:
            # 移除行首的引号和其他符号
            sentence = re.sub(r'^[「」『』""\'\*\-\s]+', '', line)
            sentence = re.sub(r'^[「」『』""\'\*\-\s]+', '', sentence)
            
            if sentence and len(sentence) > 3:
                sentences.append({
                    'part': current_part,
                    'text': sentence
                })
    
    return sentences


def generate_momo_audio(text, output_path):
    """使用MOMO API生成音频"""
    try:
        headers = {
            'Content-Type': 'application/json',
            'Authorization': f'Bearer {MOMO_API_KEY}'
        }
        
        payload = {
            "model": "momo/llm_tts_clip",
            "voice": "m-xscp",
            "input": text
        }
        
        response = requests.post(MOMO_API_URL, headers=headers, json=payload, timeout=30)
        
        if response.status_code == 200:
            with open(output_path, 'wb') as f:
                f.write(response.content)
            return True
        else:
            print(f"MOMO API Error: {response.status_code} - {response.text}")
            return False
    except Exception as e:
        print(f"MOMO API Exception: {str(e)}")
        return False


def generate_minimax_audio(text, output_path):
    """使用MiniMax API生成音频"""
    try:
        headers = {
            'Authorization': f'Bearer {MINIMAX_API_KEY}',
            'Content-Type': 'application/json'
        }
        
        payload = {
            "model": "speech-2.0-hd",
            "text": text,
            "language_boost":"Japanese",
            "stream": False,
            "voice_setting": {
                "voice_id": "changping-xiongben-323153066537136",
                "speed": 1,
                "vol": 1,
                "pitch": 0,
                "emotion": "happy"
            },
            "audio_setting": {
                "sample_rate": 32000,
                "format": "mp3",
                "channel": 1
            }
        }
        
        response = requests.post(MINIMAX_API_URL, headers=headers, json=payload, timeout=30)
        
        if response.status_code == 200:
            parsed_json = response.json()
            audio_value = bytes.fromhex(parsed_json['data']['audio'])
            with open(output_path, 'wb') as f:
                f.write(audio_value)
            return True
        else:
            print(f"MiniMax API Error: {response.status_code} - {response.text}")
            return False
    except Exception as e:
        print(f"MiniMax API Exception: {str(e)}")
        return False


def main():
    print("开始提取句子...")
    sentences = extract_sentences_from_md('1.md')
    print(f"共提取到 {len(sentences)} 个句子\n")
    
    # 生成音频索引文件
    audio_index = []
    
    for idx, item in enumerate(sentences):
        text = item['text']
        part = item['part']
        
        print(f"[{idx+1}/{len(sentences)}] 生成: {text[:30]}...")
        
        # 生成文件名
        momo_file = f"audio/momo/{idx:03d}.mp3"
        minimax_file = f"audio/minimax/{idx:03d}.mp3"
        
        # 生成MOMO音频
        momo_success = generate_momo_audio(text, momo_file)
        if momo_success:
            print(f"  ✓ MOMO音频已生成")
        else:
            print(f"  ✗ MOMO音频生成失败")
        
        time.sleep(0.5)  # 避免请求过快
        
        # 生成MiniMax音频
        minimax_success = generate_minimax_audio(text, minimax_file)
        if minimax_success:
            print(f"  ✓ MiniMax音频已生成")
        else:
            print(f"  ✗ MiniMax音频生成失败")
        
        # 记录到索引
        audio_index.append({
            'id': idx,
            'part': part,
            'text': text,
            'momo_file': momo_file,
            'minimax_file': minimax_file,
            'momo_success': momo_success,
            'minimax_success': minimax_success
        })
        
        time.sleep(0.5)  # 避免请求过快
        print()
    
    # 保存索引文件
    with open('audio_index.json', 'w', encoding='utf-8') as f:
        json.dump(audio_index, f, ensure_ascii=False, indent=2)
    
    print(f"\n完成！共生成 {len(audio_index)} 组音频")
    print(f"索引文件已保存到: audio_index.json")


if __name__ == "__main__":
    main()

