# 故障排除指南 ## 常见问题及解决方案 ### 1. 安装和环境问题 #### 问题:Python 版本不兼容 **错误信息**: ``` requires-python = ">=3.12.10" but the current Python version is 3.11.x ``` **解决方案**: 1. 升级 Python 到 3.12+ ```bash # macOS 使用 Homebrew brew install python@3.12 # 或使用 pyenv pyenv install 3.12.10 pyenv local 3.12.10 ``` 2. 验证 Python 版本 ```bash python --version # 应显示 Python 3.12.x ``` #### 问题:uv 包管理器未安装 **错误信息**: ``` command not found: uv ``` **解决方案**: ```bash # 安装 uv curl -LsSf https://astral.sh/uv/install.sh | sh # 或使用 pip pip install uv # 验证安装 uv --version ``` #### 问题:PyAudio 安装失败 **错误信息**: ``` ERROR: Failed building wheel for pyaudio portaudio.h: No such file or directory ``` **解决方案**: **macOS**: ```bash # 安装 portaudio brew install portaudio # 重新安装依赖 uv sync --reinstall ``` **Linux (Ubuntu/Debian)**: ```bash # 安装系统依赖 sudo apt-get update sudo apt-get install portaudio19-dev python3-dev # 重新安装依赖 uv sync --reinstall ``` ### 2. 模型相关问题 #### 问题:模型文件缺失 **错误信息**: ``` 错误: 缺少模型文件 缺少的文件: - /path/to/models/encoder-epoch-99-avg-1.onnx - /path/to/models/decoder-epoch-99-avg-1.onnx - /path/to/models/joiner-epoch-99-avg-1.onnx - /path/to/models/tokens.txt ``` **解决方案**: 1. 下载模型文件 ```bash uv run python main.py --download-model ``` 2. 选择合适的模型(推荐中英双语模型) 3. 等待下载完成(可能需要几分钟) 4. 验证模型文件 ```bash ls -la models/ # 应该看到 .onnx 和 tokens.txt 文件 ``` #### 问题:模型下载失败 **错误信息**: ``` 下载失败: HTTP Error 404 网络连接超时 ``` **解决方案**: 1. 检查网络连接 2. 使用代理(如果需要) ```bash export https_proxy=http://proxy.example.com:8080 uv run python main.py --download-model ``` 3. 手动下载模型文件 - 访问 sherpa-onnx 官方模型库 - 下载对应的模型文件 - 放置到 `models/` 目录 #### 问题:模型加载失败 **错误信息**: ``` RuntimeError: Failed to load model ONNX Runtime error ``` **解决方案**: 1. 检查模型文件完整性 ```bash # 检查文件大小,不应该为0 ls -lh models/*.onnx ``` 2. 重新下载模型 ```bash rm -rf models/*.onnx uv run python main.py --download-model ``` 3. 检查系统资源 - 确保有足够内存(建议4GB+) - 检查磁盘空间 ### 3. 音频设备问题 #### 问题:无法初始化音频设备 **错误信息**: ``` 错误: 无法初始化音频设备 OSError: [Errno -9996] Invalid input device ``` **解决方案**: 1. 检查音频设备 ```bash uv run python main.py --list-devices ``` 2. 确保麦克风权限 - **macOS**: 系统偏好设置 → 安全性与隐私 → 麦克风 - **Linux**: 检查用户是否在 audio 组中 ```bash groups $USER # 如果没有 audio 组,添加用户 sudo usermod -a -G audio $USER ``` 3. 测试麦克风 ```bash # macOS say "测试音频" && echo "如果听到声音,音频输出正常" # Linux arecord -d 3 test.wav && aplay test.wav ``` #### 问题:音频设备被占用 **错误信息**: ``` OSError: [Errno -9988] Stream callback result Device is busy ``` **解决方案**: 1. 关闭其他音频应用 2. 重启音频服务 ```bash # macOS sudo killall coreaudiod # Linux pulseaudio -k && pulseaudio --start ``` 3. 检查进程占用 ```bash lsof | grep audio ``` #### 问题:音频质量差 **现象**: - 识别准确率低 - 大量识别错误 - 部分结果为空 **解决方案**: 1. 检查麦克风设置 - 调整麦克风音量(建议70-80%) - 减少背景噪音 - 保持适当距离(20-30cm) 2. 调整音频参数 ```python # 在 src/config.py 中调整 class AudioConfig: chunk_size = 2048 # 增加缓冲区大小 samples_per_read = 3200 # 调整读取样本数 ``` 3. 环境优化 - 选择安静环境 - 避免回音 - 使用外接麦克风(如果可能) ### 4. 识别相关问题 #### 问题:识别结果为空 **现象**: ``` [14:30:25] [14:30:28] ``` **解决方案**: 1. 检查音频输入 ```bash uv run python main.py --log-level DEBUG # 查看是否有音频数据输入 ``` 2. 调整端点检测参数 ```python # 在 src/config.py 中调整 class ModelConfig: rule1_min_trailing_silence = 1.0 # 减少静音检测时间 rule2_min_trailing_silence = 0.5 rule3_min_utterance_length = 100 # 减少最小语音长度 ``` 3. 测试语音清晰度 - 说话清晰、语速适中 - 避免方言或口音过重 - 尝试标准普通话或英语 #### 问题:识别延迟过高 **现象**: - 说话后几秒才显示结果 - 实时性差 **解决方案**: 1. 调整音频缓冲 ```python # 减少缓冲区大小 class AudioConfig: chunk_size = 512 # 减少延迟 samples_per_read = 800 ``` 2. 优化系统性能 - 关闭不必要的程序 - 确保CPU使用率不过高 - 使用SSD存储 3. 调整线程数 ```python class ModelConfig: num_threads = 2 # 根据CPU核心数调整 ``` #### 问题:中英文混合识别错误 **现象**: - 英文单词识别为中文 - 中文识别为英文 - 混合语言断句错误 **解决方案**: 1. 确保使用中英双语模型 2. 调整断句处理 ```python # 在语音识别器中 self.enable_punctuation = True # 启用断句处理 ``` 3. 语言切换提示 - 在语言切换时稍作停顿 - 避免频繁切换语言 ### 5. 性能问题 #### 问题:内存使用过高 **现象**: - 系统内存占用持续增长 - 程序运行缓慢 - 系统卡顿 **解决方案**: 1. 监控内存使用 ```bash # 运行时监控 top -p $(pgrep -f "python main.py") ``` 2. 调整缓冲区大小 ```python class AudioConfig: chunk_size = 1024 # 减少缓冲区 ``` 3. 定期清理 ```python # 在识别器中添加清理逻辑 def cleanup_memory(self): import gc gc.collect() ``` #### 问题:CPU使用率过高 **现象**: - CPU使用率持续100% - 系统风扇高速运转 - 其他程序响应缓慢 **解决方案**: 1. 调整线程数 ```python class ModelConfig: num_threads = 1 # 减少线程数 ``` 2. 降低处理频率 ```python class AudioConfig: samples_per_read = 3200 # 增加处理间隔 ``` 3. 使用性能分析 ```bash uv run python -m cProfile main.py ``` ### 6. 文件和权限问题 #### 问题:无法创建输出文件 **错误信息**: ``` PermissionError: [Errno 13] Permission denied: 'output/transcription.txt' ``` **解决方案**: 1. 检查目录权限 ```bash ls -la output/ chmod 755 output/ ``` 2. 创建输出目录 ```bash mkdir -p output logs ``` 3. 检查磁盘空间 ```bash df -h . ``` #### 问题:日志文件过大 **现象**: - logs/app.log 文件过大 - 磁盘空间不足 **解决方案**: 1. 配置日志轮转 ```python import logging.handlers handler = logging.handlers.RotatingFileHandler( 'logs/app.log', maxBytes=10*1024*1024, backupCount=5 ) ``` 2. 清理旧日志 ```bash find logs/ -name "*.log" -mtime +7 -delete ``` 3. 调整日志级别 ```bash uv run python main.py --log-level WARNING ``` ### 7. 网络相关问题 #### 问题:模型下载网络错误 **错误信息**: ``` ConnectionError: HTTPSConnectionPool SSL: CERTIFICATE_VERIFY_FAILED ``` **解决方案**: 1. 检查网络连接 2. 配置代理 ```bash export https_proxy=http://proxy:port export http_proxy=http://proxy:port ``` 3. 跳过SSL验证(不推荐) ```python import ssl ssl._create_default_https_context = ssl._create_unverified_context ``` ### 8. 系统特定问题 #### macOS 特定问题 **问题:麦克风权限被拒绝** **解决方案**: 1. 系统偏好设置 → 安全性与隐私 → 隐私 → 麦克风 2. 添加终端或Python到允许列表 3. 重启应用 **问题:Gatekeeper 阻止运行** **解决方案**: ```bash # 允许运行未签名的应用 sudo spctl --master-disable # 或针对特定文件 xattr -d com.apple.quarantine /path/to/file ``` #### Linux 特定问题 **问题:ALSA 错误** **错误信息**: ``` ALSA lib pcm_dmix.c:1032:(snd_pcm_dmix_open) unable to open slave ``` **解决方案**: 1. 安装ALSA工具 ```bash sudo apt-get install alsa-utils ``` 2. 配置音频 ```bash alsamixer # 调整音频设置 ``` 3. 重启音频服务 ```bash sudo systemctl restart alsa-state ``` ## 调试技巧 ### 1. 启用详细日志 ```bash # 启用调试模式 uv run python main.py --log-level DEBUG # 查看日志文件 tail -f logs/app.log ``` ### 2. 测试音频输入 ```python # 创建测试脚本 test_audio.py import pyaudio import numpy as np def test_audio(): p = pyaudio.PyAudio() # 列出设备 for i in range(p.get_device_count()): info = p.get_device_info_by_index(i) print(f"Device {i}: {info['name']}") # 测试录音 stream = p.open( format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1024 ) print("开始录音5秒...") frames = [] for _ in range(int(16000 / 1024 * 5)): data = stream.read(1024) frames.append(np.frombuffer(data, dtype=np.int16)) stream.stop_stream() stream.close() p.terminate() audio_data = np.concatenate(frames) print(f"录音完成,数据长度: {len(audio_data)}") print(f"音频范围: {audio_data.min()} 到 {audio_data.max()}") if __name__ == "__main__": test_audio() ``` ### 3. 性能监控 ```python # 创建性能监控脚本 monitor.py import psutil import time def monitor_performance(): process = psutil.Process() while True: cpu_percent = process.cpu_percent() memory_info = process.memory_info() memory_mb = memory_info.rss / 1024 / 1024 print(f"CPU: {cpu_percent:.1f}%, 内存: {memory_mb:.1f}MB") time.sleep(1) if __name__ == "__main__": monitor_performance() ``` ## 获取帮助 ### 1. 收集诊断信息 运行以下命令收集系统信息: ```bash # 创建诊断脚本 cat > diagnose.py << 'EOF' import sys import platform import subprocess print("=== 系统信息 ===") print(f"操作系统: {platform.system()} {platform.release()}") print(f"Python版本: {sys.version}") print(f"架构: {platform.machine()}") print("\n=== Python包信息 ===") try: result = subprocess.run(['uv', 'pip', 'list'], capture_output=True, text=True) print(result.stdout) except: print("无法获取包信息") print("\n=== 音频设备信息 ===") try: import pyaudio p = pyaudio.PyAudio() for i in range(p.get_device_count()): info = p.get_device_info_by_index(i) print(f"设备 {i}: {info['name']} (输入通道: {info['maxInputChannels']})") p.terminate() except Exception as e: print(f"音频设备检测失败: {e}") EOF python diagnose.py ``` ### 2. 提交问题报告 在提交问题时,请包含: 1. 详细的错误信息 2. 系统诊断信息 3. 重现步骤 4. 预期行为 5. 实际行为 6. 相关日志文件 ### 3. 社区支持 - 查看项目文档 - 搜索已知问题 - 提交 GitHub Issue - 参与社区讨论 --- 如果以上解决方案都无法解决您的问题,请收集详细的错误信息和系统诊断信息,然后提交问题报告。