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

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

# MiniMax API配置
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')
    
    for line in lines:
        line = line.strip()
        if not line:
            continue
        
        # 提取日语句子（包含日语字符的句子）
        # 检查是否包含日语字符（平假名、片假名或汉字）
        if re.search(r'[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF]', line):
            # 移除行首的引号和其他符号
            sentence = re.sub(r'^[「」『』""\'\*\-\s]+', '', line)
            sentence = re.sub(r'[「」『』""\'\*\-\s]+$', '', sentence)
            
            # 去掉括号里的注音（避免重复朗读）
            sentence = re.sub(r'（[^）]+）', '', sentence)
            sentence = re.sub(r'\([^)]+\)', '', sentence)
            
            if sentence and len(sentence) > 3:
                sentences.append(sentence)
    
    return sentences


def generate_minimax_audio(text, output_path):
    """使用MiniMax API生成音频"""
    try:
        headers = {
            'Authorization': f'Bearer {MINIMAX_API_KEY}',
            'Content-Type': 'application/json'
        }
        
        payload = {
            "model": "speech-02-hd",
            "text": text,
            "language_boost": "Japanese",
            "stream": False,
            "voice_setting": {
                "voice_id": "shanshan-daily-324835325153443",
                "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"  ✗ API错误: {response.status_code} - {response.text}")
            return False
    except Exception as e:
        print(f"  ✗ 异常: {str(e)}")
        return False


def main():
    print("=" * 60)
    print("MiniMax 音频生成脚本")
    print("=" * 60)
    
    input_file = '1.md'
    print(f"\n读取文件: {input_file}")
    print("开始提取句子...")
    
    sentences = extract_sentences_from_md(input_file)
    print(f"共提取到 {len(sentences)} 个句子\n")
    
    # 生成音频索引文件
    audio_index = []
    success_count = 0
    fail_count = 0
    
    for idx, text in enumerate(sentences):
        print(f"[{idx+1}/{len(sentences)}] {text[:40]}...")
        
        # 生成文件名（从001到200）
        minimax_file = f"audio/minimax/minimax_{idx+1:03d}.mp3"
        
        # 生成MiniMax音频
        success = generate_minimax_audio(text, minimax_file)
        if success:
            print(f"  ✓ 音频已生成: {minimax_file}")
            success_count += 1
        else:
            print(f"  ✗ 音频生成失败")
            fail_count += 1
        
        # 记录到索引（id从1开始）
        audio_index.append({
            'id': idx + 1,
            'text': text,
            'file': minimax_file,
            'success': success
        })
        
        # 避免请求过快
        time.sleep(0.5)
        print()
    
    # 保存索引文件
    index_file = 'audio_index_minimax.json'
    with open(index_file, 'w', encoding='utf-8') as f:
        json.dump(audio_index, f, ensure_ascii=False, indent=2)
    
    print("=" * 60)
    print(f"完成！")
    print(f"成功: {success_count} 个")
    print(f"失败: {fail_count} 个")
    print(f"索引文件已保存到: {index_file}")
    print("=" * 60)


if __name__ == "__main__":
    main()

