"""
VAD 语音活动检测测试
使用 TTS 生成的音频文件测试
"""

from pathlib import Path
from src.Module.vad.vad import SileroVAD, detect_speech_segments


def test_detect_file():
    """测试文件语音检测"""
    print("=" * 60)
    print("     VAD 语音活动检测测试")
    print("=" * 60)

    # 使用 TTS 生成的测试音频
    audio_file = Path(__file__).parent.parent / 'tts' / 'output' / 'stream_test.wav'

    if not audio_file.exists():
        print(f"[跳过] 音频文件不存在: {audio_file}")
        print("请先运行 TTS 测试生成音频文件")
        return False

    print(f"\n音频文件: {audio_file.name}")

    # 检测语音段落
    print("\n加载 SileroVAD 模型...")
    segments = detect_speech_segments(
        str(audio_file),
        min_silence_duration_ms=300  # 设置较短的静音阈值
    )

    print(f"\n检测到 {len(segments)} 个语音段落:")
    for i, seg in enumerate(segments):
        duration = seg.end_ms - seg.start_ms
        print(f"  [{i +
                    1}] {seg.start_ms /
                         1000:.2f}s - {seg.end_ms /
                                       1000:.2f}s (时长: {duration /
                                                        1000:.2f}s)")

    return len(segments) > 0


def test_realtime_detection():
    """测试实时检测"""
    print("\n" + "=" * 60)
    print("实时检测模拟测试")
    print("=" * 60)

    import wave

    audio_file = Path(__file__).parent.parent / 'tts' / 'output' / 'stream_test.wav'

    if not audio_file.exists():
        print(f"[跳过] 音频文件不存在")
        return False

    # 读取音频
    with wave.open(str(audio_file), 'rb') as wav:
        sample_rate = wav.getframerate()
        audio_data = wav.readframes(wav.getnframes())

    print(f"\n采样率: {sample_rate} Hz")
    print(f"音频长度: {len(audio_data) / 2 / sample_rate:.2f} 秒")

    # 创建 VAD
    vad = SileroVAD()

    # 模拟实时流式检测
    chunk_size = 512 * 2  # 512 samples * 2 bytes
    voice_detected = False

    print("\n模拟实时流式检测:")
    for i in range(0, len(audio_data), chunk_size):
        chunk = audio_data[i:i + chunk_size]
        if len(chunk) < chunk_size:
            break

        result = vad.detect(chunk)

        if result.voice_start:
            print(f"  [{i / 2 / sample_rate:.2f}s] 语音开始")
            voice_detected = True
        if result.voice_end:
            print(f"  [{i / 2 / sample_rate:.2f}s] 语音结束")

    return voice_detected


if __name__ == '__main__':
    results = []

    success1 = test_detect_file()
    results.append(("文件语音检测", success1))

    success2 = test_realtime_detection()
    results.append(("实时检测模拟", success2))

    print("\n" + "=" * 60)
    print("测试结果:")
    for name, success in results:
        status = "✓ 通过" if success else "✗ 失败/跳过"
        print(f"  {name}: {status}")
