#!/usr/bin/env python3
"""
读取字幕文件所有行，为每一句生成独立的TTS音频文件
"""
import os
import tempfile
import asyncio
from edge_tts import Communicate

# 导入编码处理模块
from console_helper import (
    safe_print, print_header, print_step, print_info,
    print_success, print_fail, print_done
)

def read_all_subtitle_lines(subtitle_path):
    """读取字幕文件的所有行"""
    subtitles = []
    try:
        with open(subtitle_path, 'r', encoding='utf-8') as f:
            lines = f.readlines()
        
        current_line = 0
        current_text = []
        
        for line in lines:
            line = line.strip()
            if line.isdigit():
                # 新的字幕开始
                if current_text and current_line > 0:
                    subtitles.append(' '.join(current_text))
                    current_text = []
                current_line = int(line)
            elif ' --> ' in line:
                # 跳过时间轴
                continue
            elif line:
                # 字幕文本
                current_text.append(line)
        
        # 添加最后一个字幕
        if current_text and current_line > 0:
            subtitles.append(' '.join(current_text))
        
        return subtitles
    except Exception as e:
        safe_print(f"      读取字幕失败: {e}")
        return []

async def generate_tts_audio(text, output_path, voice="en-US-AriaNeural", rate="-25%"):
    """使用Edge TTS生成音频"""
    try:
        # rate参数设置语速，-25%对应0.75倍速度
        # pitch参数保持默认，不变调
        tts = Communicate(text, voice, rate=rate)
        await tts.save(output_path)
        return True
    except Exception as e:
        safe_print(f"      生成TTS音频失败: {e}")
        return False

def get_audio_duration(audio_path):
    """获取音频时长"""
    import subprocess
    args = [
        'ffprobe',
        '-v', 'quiet',
        '-print_format', 'json',
        '-show_format',
        audio_path
    ]
    
    try:
        result = subprocess.run(args, check=True, capture_output=True, text=True)
        import json
        data = json.loads(result.stdout)
        return float(data['format']['duration'])
    except Exception as e:
        safe_print(f"      获取音频时长失败: {e}")
        return 0

async def main():
    subtitle_path = "subtitles.srt"
    output_dir = "tts_audio_all"
    
    print_header("TTS音频生成工具 (处理所有行)")
    safe_print(f"字幕文件: {subtitle_path}")
    safe_print("")
    
    # 创建输出目录
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    # 1. 读取所有字幕行
    print_step(1, 2, "读取所有字幕行...")
    subtitles = read_all_subtitle_lines(subtitle_path)
    if not subtitles:
        safe_print("读取字幕失败，退出")
        return
    
    total_lines = len(subtitles)
    print_info("总行数", str(total_lines))
    safe_print("")
    
    # 2. 为每句生成TTS音频
    print_step(2, 2, "生成TTS音频...")
    total_duration = 0
    for i, subtitle in enumerate(subtitles, 1):
        # 使用WAV格式，便于后续处理
        output_path = os.path.join(output_dir, f"tts_line_{i}.wav")
        safe_print(f"      生成第{i}/{total_lines}行音频...")
        # 设置语速为0.75倍（-25%），不变调
        if await generate_tts_audio(subtitle, output_path, rate="-25%"):
            duration = get_audio_duration(output_path)
            total_duration += duration
            print_info(f"      第{i}行音频", f"{output_path} ({duration:.2f}秒)")
        else:
            safe_print(f"      生成第{i}行音频失败")
            return
    
    print_info("总时长", f"{total_duration:.2f}秒")
    print_info("输出目录", output_dir)
    print_info("格式", "WAV (无损格式，便于后续处理)")
    print_info("语速", "0.75倍 (不变调)")
    
    print_done()

if __name__ == '__main__':
    asyncio.run(main())
