#!/usr/bin/env python3
"""
根据字幕时间截分中文音频（前10句）- 使用间隔中点作为分割点
策略：
- 第0句：从0开始，到(句0.end + 句1.start)/2
- 第1句：从(句0.end + 句1.start)/2开始，到(句1.end + 句2.start)/2
- 最后一句：从(前一句.end + 当前句.start)/2开始，到当前句.end
"""
import sqlite3
import os
import subprocess

# 数据库路径
db_path = "\\\\ll\\D\\xtrssvjj\\dpd.db"

# 音频文件
audio_path = "\\\\ll\\D\\xtrssvjj\\师徒一场_张雪峰走好_上.mp3"

# 输出目录
audio_segments_dir = "shitu_audio_segments"
if not os.path.exists(audio_segments_dir):
    os.makedirs(audio_segments_dir)

# 查询前10句字幕
try:
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()

    cursor.execute("SELECT idx, start, end, cn FROM srts WHERE adid = 8281 ORDER BY idx ASC LIMIT 10")
    subtitles = cursor.fetchall()

    print(f"截分前 {len(subtitles)} 句中文音频（使用间隔中点分割）")
    print("\n字幕原始时间:")
    for idx, start, end, cn in subtitles:
        print(f"  句{idx}: {start}ms - {end}ms - {cn[:20]}...")

    print("\n截取区间（使用间隔中点）:")

    for i, (idx, start_ms, end_ms, cn) in enumerate(subtitles):
        # 计算开始时间点
        if i == 0:
            seg_start = 0  # 第0句从0开始
        else:
            # 从上一句和当前句的间隔中点开始
            prev_end_ms = subtitles[i-1][2]
            seg_start = (prev_end_ms + start_ms) / 2000  # 转换为秒

        # 计算结束时间点
        if i < len(subtitles) - 1:
            # 到当前句和下一句的间隔中点结束
            next_start_ms = subtitles[i+1][1]
            seg_end = (end_ms + next_start_ms) / 2000  # 转换为秒
        else:
            # 最后一句：到当前句结束
            seg_end = end_ms / 1000

        duration = seg_end - seg_start

        print(f"  句{idx}: {seg_start:.2f}s - {seg_end:.2f}s ({duration:.2f}s) - {cn[:20]}...")

        # 使用FFmpeg截取音频片段
        output_file = os.path.join(audio_segments_dir, f"audio_line_{idx:03d}.wav")

        cmd = [
            'ffmpeg', '-y',
            '-i', audio_path,
            '-ss', f'{seg_start:.3f}',
            '-t', f'{duration:.3f}',
            '-c:a', 'pcm_s16le',
            '-ar', '44100',
            '-ac', '1',
            output_file
        ]

        print(f"    生成: {output_file}")
        result = subprocess.run(cmd, capture_output=True, text=True, encoding='utf-8', errors='ignore')

        if result.returncode != 0:
            print(f"    错误: {result.stderr[-200:] if result.stderr else '未知错误'}")

    conn.close()
    print(f"\n完成！音频片段保存在: {audio_segments_dir}")

    # 验证结果
    print("\n验证结果:")
    for i in range(10):
        idx = f"{i:03d}"
        output_file = os.path.join(audio_segments_dir, f"audio_line_{idx}.wav")
        if os.path.exists(output_file):
            cmd = ['ffprobe', '-v', 'error', '-show_entries', 'format=duration',
                   '-of', 'default=noprint_wrappers=1:nokey=1', output_file]
            result = subprocess.run(cmd, capture_output=True, text=True)
            duration = float(result.stdout.strip()) if result.returncode == 0 else 0
            print(f"  句{i}: {duration:.2f}s")

except Exception as e:
    print(f"错误: {e}")
