You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

629 lines
12 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 故障排除指南
## 常见问题及解决方案
### 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
- 参与社区讨论
---
如果以上解决方案都无法解决您的问题,请收集详细的错误信息和系统诊断信息,然后提交问题报告。