mcpField
A
audio-quality-check

audio-quality-check

github.com/tenequm创意与媒体4058 次安装5 天前更新
代码仓库

关于 audio-quality-check

audio-quality-check 是用于分析通话录音的技能,支持双轨 M4A、单轨录音和 AEC 处理文件。它通过附带的 Python 脚本报告音频质量、回声、轨道串音及相关指标。

主要功能

  1. 01分析双轨和单轨音频
  2. 02测量响度与信噪比
  3. 03检测回声和轨道串音
  4. 04评估语音质量与可懂度
  5. 05报告频谱和逐分钟能量指标

适用场景

  1. 01检查通话录音中的回声
  2. 02比较原始与 AEC 处理语音
  3. 03定位噪声、静音或异常响亮片段

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/tenequm/skills --skill audio-quality-check

安装后在 Claude Code 中输入/audio-quality-check确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE.txt
evals/
evals.json
scripts/
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