3.7 KiB
3.7 KiB
Audio Processes 改进总结
问题背景
- 原始问题:TTS音频只播放3个字符就停止,出现ALSA underrun错误
- 根本原因:音频缓冲区管理不当,播放策略过于保守
改进内容
1. 音频播放优化 (_play_audio 方法)
- 改进前:保守的播放策略,需要缓冲区有足够数据才开始播放
- 改进后:
- 借鉴 recorder.py 的播放策略:只要有数据就播放
- 添加错误恢复机制,自动检测和恢复 ALSA underrun
- 优化缓冲区管理,减少延迟
2. TTS 工作线程模式
- 参考: recorder.py 的 TTS 工作线程实现
- 实现功能:
- 独立的 TTS 工作线程处理音频生成
- 任务队列管理,避免阻塞主线程
- 统一的 TTS 请求接口
process_tts_request() - 支持流式音频处理
3. 统一的音频播放队列
- InputProcess 和 OutputProcess 都支持:
- TTS 工作线程
- 音频生成和播放队列
- 统一的错误处理和日志记录
4. 关键改进点
音频播放策略
# 改进前:保守策略
if len(self.playback_buffer) > 2: # 需要缓冲区有足够数据
# 开始播放
# 改进后:积极策略 + 错误恢复
audio_chunk = self.playback_buffer.pop(0)
if audio_chunk and len(audio_chunk) > 0:
try:
self.output_stream.write(audio_chunk)
# 统计信息
except Exception as e:
# ALSA underrun 错误恢复
if "underrun" in str(e).lower():
# 自动恢复音频流
TTS 工作线程
def _tts_worker(self):
"""TTS工作线程 - 处理TTS任务队列"""
while self.tts_worker_running:
try:
task = self.tts_task_queue.get(timeout=1.0)
if task is None:
break
task_type, content = task
if task_type == "tts_sentence":
self._generate_tts_audio(content)
self.tts_task_queue.task_done()
except queue.Empty:
continue
except Exception as e:
self.logger.error(f"TTS工作线程错误: {e}")
错误恢复机制
# ALSA underrun 检测和恢复
if "underrun" in str(e).lower() or "alsa" in str(e).lower():
self.logger.info("检测到ALSA underrun,尝试恢复音频流")
try:
if self.output_stream:
self.output_stream.stop_stream()
time.sleep(0.1)
self.output_stream.start_stream()
self.logger.info("音频流已恢复")
except Exception as recovery_e:
self.logger.error(f"恢复音频流失败: {recovery_e}")
self.playback_buffer.clear()
5. 性能优化
- 减少日志输出频率,提高性能
- 优化队列处理策略,使用适当的超时设置
- 动态调整休眠时间,根据播放状态优化CPU使用
6. 测试和验证
- 创建了测试脚本
test_audio_processes.py - 验证了语法正确性
- 可以测试 TTS 功能的完整性
使用方法
在控制系统中使用
from audio_processes import InputProcess, OutputProcess
# 创建输入和输出进程
input_process = InputProcess(command_queue, event_queue)
output_process = OutputProcess(audio_queue)
# 处理TTS请求
output_process.process_tts_request("你好,这是测试语音")
独立测试
python test_audio_processes.py
预期效果
- 解决 ALSA underrun 错误
- 提高音频播放的流畅性
- 减少 TTS 处理的延迟
- 提供更稳定的音频处理能力
注意事项
- 确保系统安装了必要的依赖:
requests,pyaudio - 检查音频设备是否正常工作
- 网络连接正常(用于TTS服务)
- 适当调整音频参数以适应不同环境