关于 audio-quality-check
audio-quality-check 是用于分析通话录音的技能,支持双轨 M4A、单轨录音和 AEC 处理文件。它通过附带的 Python 脚本报告音频质量、回声、轨道串音及相关指标。
主要功能
- 01分析双轨和单轨音频
- 02测量响度与信噪比
- 03检测回声和轨道串音
- 04评估语音质量与可懂度
- 05报告频谱和逐分钟能量指标
适用场景
- 01检查通话录音中的回声
- 02比较原始与 AEC 处理语音
- 03定位噪声、静音或异常响亮片段
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ tenequm/ skills --skill audio-quality-check安装后在 Claude Code 中输入/audio-quality-check确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSE.txtevals/evals.jsonscripts/analyze_recording.py详细介绍
音频录制质量分析器
全面分析通话录音的音频质量。支持双轨 M4A 文件(系统音频 + 麦克风)、单轨录音和经过 AEC 处理的文件。
快速开始
在录音目录上运行捆绑的分析脚本:
python ${CLAUDE_SKILL_DIR}/scripts/analyze_recording.py "/path/to/recording/directory"
针对特定内容进行分析的模式:
python ${CLAUDE_SKILL_DIR}/scripts/analyze_recording.py /path --tracks # track info only
python ${CLAUDE_SKILL_DIR}/scripts/analyze_recording.py /path --echo # echo detection only
python ${CLAUDE_SKILL_DIR}/scripts/analyze_recording.py /path --quality # quality metrics (skip echo)
对于 Blackbox 录音,目录通常为:
~/Library/Application Support/Blackbox/Recordings/<timestamp-id>/
依赖项
系统:ffmpeg、ffprobe(通过 brew install ffmpeg 安装)
Python:numpy、soundfile、scipy、pyloudnorm、pesq、pystoi、librosa
安装所有 Python 依赖项:pip3 install numpy soundfile scipy pyloudnorm pesq pystoi librosa
各项指标说明
EBU R128 响度(pyloudnorm)
- 含义:以 LUFS(满量程响度单位)表示的感知响度
- 目标:语音为 -16 至 -24 LUFS
- 注意:AEC/后处理音轨的响度是否显著高于原始音轨(这表明处理过程只放大音量,却没有进行标准化)
回声检测——自相关
- 含义:通过计算信号与其在不同时间偏移处的相关性,检测单条音轨中信号的延迟副本
- 读数解读:在 20–100ms 范围内,相关性 > 0.3 的峰值表示信号重复。延迟量表示重复副本的延迟时间
- 关键见解:如果多个时间片段在相同延迟量处出现稳定峰值,说明存在系统性的信号重复(例如 Krisp 这类虚拟音频处理器在约 53ms 处引入延迟副本)
- 正常值:低于 0.15 的峰值通常是语音基频谐波(无害)。在固定延迟量处高于 0.3 的峰值则表示回声
跨音轨相关性
- 含义:测量一条音轨中的内容有多少出现在另一条音轨中(例如系统音频串入麦克风音轨)
- 读数解读:接近 0 表示没有串音。高于 0.1 表示麦克风拾取到了系统音频
- 相干性:同一测试在频域中的表现形式。对于语音回声,语音频段相干性(300–3400Hz)最为相关
PESQ——语音质量(需要参考信号和退化信号)
- 含义:ITU-T P.862 标准。通过比较退化信号与参考信号,给出 MOS(平均意见分)
- 范围:1.0(较差)至 4.5(极佳)。NB = 窄带(电话质量),WB = 宽带
- 用途:比较经过 AEC 处理的麦克风音轨与原始麦克风音轨,判断处理是改善还是损害了音质
- 阈值:4.0 以上为极佳,3.0 以上为良好,2.5–3.0 为一般,低于 2.5 为较差
STOI——语音可懂度(需要参考信号和退化信号)
- 含义:短时客观可懂度。测量处理后语音的可理解程度
- 范围:0.0 至 1.0
- 阈值:>0.8 为良好,>0.6 为一般,<0.6 为较差
- 关键见解:如果处理后的 STOI 相较原始信号显著下降,说明处理降低了语音可懂度
频谱分析(librosa)
- 质心:按振幅加权的平均频率。数值越高,音频越明亮/刺耳
- 频谱滚降点(85%):频谱能量中 85% 所处频率的下限。数值越低,低音越重
- 过零率:信号穿过零点的频率。数值越高,信号噪声越大。语音通常为 0.05–0.20;高于 0.30 表示噪声明显
SNR——信噪比
- 含义:语音能量与背景噪声能量之比(通过基于能量的 VAD 估算)
- 阈值:>20dB 为极佳,>15dB 为良好,>10dB 为一般,<10dB 为较差
- 注意:此指标衡量背景噪声,而非回声。录音即使信噪比极佳,仍可能存在回声问题
每分钟能量
- 含义:录音每分钟的 RMS 能量和语音频段能量
- 用途:找出静音片段(麦克风中断)、音量意外升高的片段(有削波风险),或有助于识别说话者活跃时段的活动模式
手动分析方法
需要进行脚本未提供的分析时,可以参考以下方法。
从双轨 M4A 中提取单独音轨
ffmpeg -y -i audio.m4a -map 0:0 -ac 1 -ar 16000 /tmp/system.wav
ffmpeg -y -i audio.m4a -map 0:1 -ac 1 -ar 16000 /tmp/mic.wav
使用 sox 快速检查响度
sox audio.wav -n stat 2>&1
检查特定时间范围内的回声(Python)
import numpy as np
import soundfile as sf
from scipy import signal
data, sr = sf.read('/tmp/system.wav')
# Analyze 5 seconds starting at 2 minutes
start = 120 * sr
seg = data[start:start + 5*sr]
seg_norm = seg / (np.max(np.abs(seg)) + 1e-10)
autocorr = np.correlate(seg_norm, seg_norm, mode='full')
mid = len(seg_norm) - 1
autocorr = autocorr / autocorr[mid]
# Check 20-100ms range for echo peaks
min_lag = int(0.020 * sr)
max_lag = int(0.100 * sr)
region = autocorr[mid + min_lag:mid + max_lag]
peaks, props = signal.find_peaks(region, height=0.1)
for i, p in enumerate(peaks[:5]):
lag_ms = (p + min_lag) / sr * 1000
print(f" Peak at {lag_ms:.1f}ms, r={props['peak_heights'][i]:.3f}")
常见问题及成因
| 症状 | 可能原因 | 检查方法 |
|---|---|---|
| 说话声略有重叠或回声 | 虚拟音频处理器(Krisp)在系统音频中产生了延迟副本 | 自相关:40-60ms 处存在稳定峰值 |
| 麦克风音轨中有远端说话者的声音 | 声学回声(声音从扬声器传到麦克风) | 跨音轨相关性 > 0.1 |
| 经过 AEC 处理的文件听起来更差 | DTLN-aec 降低了信号质量 | 比较处理前后的 PESQ/STOI |
| 经过 AEC 处理的文件音量过大 | 处理后未进行响度标准化 | 响度:处理后 > -10 LUFS |
| 录音中有嘶嘶声/噪声 | 信噪比较低、麦克风有噪声或存在 AGC 伪影 | SNR < 15dB,过零率较高 |
| 录音中段出现安静片段 | 麦克风中断或设备发生变化 | 每分钟能量:RMS 突然下降 |
评论
支持 Markdown