Local-Voice/test_optimization.py
2025-09-21 16:00:31 +08:00

173 lines
6.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
音频播放优化测试脚本
用于验证缓冲区优化和播放性能改进
"""
import time
import json
import os
import sys
def test_optimization():
"""测试优化效果"""
print("🧪 音频播放优化测试")
print("=" * 50)
# 显示优化后的配置参数
print("📋 优化后的配置参数:")
print(" - 预加载缓冲区: 6个音频块原:3个")
print(" - 智能句子缓冲: 最多5个句子原:3个")
print(" - 最小触发句子: 2个句子原:1个")
print(" - 积累时间窗口: 150ms原:200ms")
print(" - TTS任务队列: 20个任务原:10个")
print(" - 音频块大小: 1024字节原:2048字节")
print(" - 播放冷却期: 0.05秒(原:0.1秒)")
print(" - 长句子触发阈值: 30字符原:50字符")
print(" - 播放缓冲区维护: 4个块原:3个")
print()
# 测试智能句子缓冲逻辑
print("🧠 测试智能句子缓冲逻辑:")
print(" 🔄 首次播放逻辑测试:")
test_sentences = [
"你好", # 短句子
"今天天气怎么样?", # 中等长度
"我觉得这个方案很不错,我们可以试试看。", # 长句子
"这是一个超过三十个字符的句子应该会立即触发TTS生成。", # 超过30字符
"短句。", # 带标点的短句
]
# 模拟首次播放的缓冲区状态
tts_buffer = []
first_playback_started = False
total_buffered_text = ""
trigger_count = 0
for i, sentence in enumerate(test_sentences):
tts_buffer.append(sentence)
total_buffered_text = ''.join(tts_buffer)
# 首次播放逻辑
if not first_playback_started:
should_trigger = False
trigger_reason = ""
# 条件1: 总文本长度超过40字符且至少有2个句子
if len(total_buffered_text) >= 40 and len(tts_buffer) >= 2:
should_trigger = True
trigger_reason = f"总长度{len(total_buffered_text)}字符,{len(tts_buffer)}个句子"
# 条件2: 有1个完整长句子超过25字符
elif len(sentence) >= 25 and sentence.endswith(('', '', '', '.', '!', '?')) and len(tts_buffer) >= 2:
should_trigger = True
trigger_reason = f"长句子{len(sentence)}字符+缓冲内容"
# 条件3: 缓冲区达到最大值(5个)
elif len(tts_buffer) >= 5:
should_trigger = True
trigger_reason = f"缓冲区达到最大值{len(tts_buffer)}"
# 条件4: 超过500ms模拟
if should_trigger:
trigger_count += 1
first_playback_started = True
print(f" 🎵 首次触发TTS: {trigger_reason}")
print(f" 📝 发送内容: '{total_buffered_text[:50]}...'")
tts_buffer = []
else:
print(f" ⏳ 首次缓冲: '{sentence}' (累计: {len(total_buffered_text)}字符, {len(tts_buffer)}个句子)")
else:
# 正常播放逻辑
if len(sentence) > 30 or len(tts_buffer) >= 3:
should_trigger = True
trigger_reason = "长句子" if len(sentence) > 30 else "缓冲区满"
if should_trigger:
trigger_count += 1
print(f" ✅ 正常触发TTS: {trigger_reason}")
print(f" 📝 发送内容: '{''.join(tts_buffer)[:30]}...'")
tts_buffer = []
else:
print(f" ⏳ 正常缓冲: '{sentence}'")
print(f" 📊 总触发次数: {trigger_count}")
print()
print(" 📋 首次播放优化效果:")
print(" • 确保首句有足够长度40+字符或25+字符完整句)")
print(" • 积累多个句子避免播放卡顿")
print(" • 5秒超时机制防止无限等待")
print(" • 后续句子正常流式处理")
print()
# 显示性能监控信息
print("📊 性能监控功能:")
print(" - 实时缓冲区大小统计")
print(" - 平均和最大缓冲区大小")
print(" - 播放块数和音频大小统计")
print(" - 每5秒自动输出性能报告")
print()
print("🎯 预期改进效果:")
print(" 1. ✅ 减少音频播放卡顿(更大的缓冲区)")
print(" 2. ✅ 更快的TTS响应优化的触发条件")
print(" 3. ✅ 更流畅的播放体验(减少冷却期)")
print(" 4. ✅ 更好的资源利用(更小的音频块)")
print(" 5. ✅ 实时性能监控(调试和优化)")
print()
print("📝 测试建议:")
print(" 1. 运行主程序观察播放流畅度")
print(" 2. 查看性能统计输出")
print(" 3. 监控缓冲区大小变化")
print(" 4. 测试不同长度的语音响应")
print()
print("🚀 测试完成!可以运行主程序验证优化效果。")
def show_optimization_summary():
"""显示优化总结"""
print("📈 音频播放优化总结")
print("=" * 50)
summary = {
"缓冲区优化": [
"预加载缓冲区: 3→6个块",
"智能句子缓冲: 3→5个句子",
"最小触发缓冲: 1→2个句子",
"TTS任务队列: 10→20个任务"
],
"响应性优化": [
"积累时间窗口: 200ms→150ms",
"长句子触发: 50→30字符",
"中等长度触发: 30→20字符",
"播放冷却期: 0.1s→0.05s"
],
"播放优化": [
"音频块大小: 2048→1024字节",
"播放缓冲维护: 3→4个块",
"数据转移: 2→3个块/次"
],
"监控功能": [
"实时性能统计",
"缓冲区大小监控",
"自动性能报告",
"播放进度追踪"
]
}
for category, improvements in summary.items():
print(f"\n🔧 {category}:")
for improvement in improvements:
print(f"{improvement}")
print(f"\n🎯 总体目标: 减少音频播放卡顿,提升用户体验")
print(f"📊 预期效果: 更流畅的实时语音交互")
if __name__ == "__main__":
if len(sys.argv) > 1 and sys.argv[1] == "--summary":
show_optimization_summary()
else:
test_optimization()