来源:
notes/sources/dg_audio_loopback/measurements.mddg X5 麦克风/耳机链路实测记录(2026-09-20)
设备:D-Robotics RDK X5(dg,root@10.71.48.154),Ubuntu 22.04,内核 6.1.83,8×aarch64,3GB RAM
声卡:ES8326(i2c 7-0018,I2S0),单声卡 duplex-audio,唯一 PCM hw:0,0(播放/录音共用)
1. 支持的采样率(arecord -D hw:0,0,看 dmesg 是否报错)
| 采样率 | 结果 | dmesg |
|---|---|---|
| 8000 | OK | 无告警 |
| 16000 | OK | 无告警 |
| 32000 | OK | 无告警 |
| 48000 | OK | 无告警 |
| 22050 | 通但有告警 | Clock coefficients do not match |
| 44100 | 通但有告警 | Clock coefficients do not match |
根因:MCLK 固定(时钟树 dsp_i2s0_mclk = 24545455 Hz,即 24.576MHz 档),ES8326 驱动
get_coeff(mclk, rate) 要求 MCLK 精确命中系数表。44100 对应表项只有
2822400 / 5644800 / 11289600 / 22579200,24545455 命中不了 → 返回 -EINVAL →
驱动打印告警并跳过写 CLK_DIV1/2、CLK_DLL、CLK_MUX、ADC/DAC_SEL、OSR 等 8 个分频寄存器,
codec 保持上一次(48000)的系数。
读回寄存器证实:48k 播放后 04=e0 05=00 06=00 07=2d 08=48 09=08 0a=1f 0b=1f,
正是表中 {512, 48000, 24576000, ...} 那一行。
2. 变调实测(声学回环:喇叭放音 → 麦克风录回)
| 播放采样率 | 录回的主峰频率 | 理论值 440×48000/44100 |
|---|---|---|
| 48000 | 440.0 Hz | — |
| 44100 | 479.0 Hz | 478.9 Hz |
结论:绕开 PulseAudio 直接用 hw:0,0 播 44.1k 素材会升高约 8.84%(≈1.5 个半音)。
走 PulseAudio(aplay -D default)时 PA 会重采样到 48k,44.1k 和 48k 素材回录都是准确的 440 Hz。
3. Mixer 关键寄存器(原始值)
| 控件 | numid | 值 | dB |
|---|---|---|---|
DAC Playback Volume |
1 | 151 | -20.0 |
HPL Playback Volume |
19 | 151 | -20.0 |
HPR Playback Volume |
20 | 191 | 0.0 |
SPKL/SPKR Playback Volume |
21/22 | 191 | 0.0 |
HPVol SPKVol Switch |
23 | 0 | HPVOL: HPL+HPL, SPKVOL: HPL+HPL |
ADC Capture Volume |
7 | 191/191 | 0.0 |
ADC PGA Volume |
8 | 0/0 | 0.0 |
ADC PGA Gain Volume |
9 | 8 | +24.0 |
DAC与HPL是同一个寄存器ES8326_DACL_VOL,改一个另一个跟着变。HPVol SPKVol Switch=0 时左右耳机音量都取HPL,HPR=191 实际不生效; 因此耳机输出被压在 -20 dB,想要满幅需把HPL提到 191。- 可用增益余量:
ADC PGA0→5(每级 6 dB,最多 +30 dB)、ADC PGA Gain8→10(+6 dB)、ADC Capture191→255(+32 dB)。
4. 麦克风体检
| 项目 | 结果 |
|---|---|
| 声道结构 | 录制数据 L/R 完全相同 → 单麦克风复制到双声道 |
| 环境录音 10s RMS | -44.9 dBFS |
| 底噪(60s 的 10% 分位) | -65.7 dBFS |
| 直流偏置 | +1.1 |
| 50 Hz / 100 Hz 工频 | -98.5 / -89.5 dBFS(无工频干扰) |
| 起始瞬态 | 前 ~20 个样本满刻度削波(录音起始爆音) |
| 拾音验证 | 播放 1 kHz 测试音,麦克风该频点 -67.8 → -52.5 dBFS(+15.3 dB) |
增益实验:ADC PGA 0→5(+30 dB)后整体电平 -47.3 → -17.1 dBFS(正好 +30 dB),
300–3400 Hz 频谱平坦度 0.264 → 0.226(几乎不变)→ 并没有隐藏的语音被挖出来。
5. 人声判定(关键,第一次判错了)
判据:短时自相关基频强度(40 ms 帧,lag 对应 70–350 Hz),> 0.3 视为浊音。
| 文件 | 浊音帧 | 基频范围 | 结论 |
|---|---|---|---|
mic_take.wav(第一次 10s) |
11/40 = 28% | 零星 | 少量浊音 |
mic_take2.wav(第二次 10s) |
33/40 = 82% | 85–160 Hz 起伏 | 确认有人说话 |
窄带语谱图(FFT 1024 @ 8 kHz,7.8 Hz/bin)里 mic_take2.wav 低频段出现清晰谐波横条,
且横条随语调上下摆动 —— 浊音特征。mic_take.wav 只有零星几小段。
教训:低电平人声(峰值仅 -53.9 dBFS,比底噪高 10–20 dB)不能靠电平/频段能量阈值判断, 必须用周期性/谐波性判据,否则会误判成”只有底噪”。
频谱分布:能量集中在 800 Hz 以下,1.5 kHz 以上很弱 → 擦音/辅音基本丢失, 这会明显拉低 ASR 准确率。
6. 回放程序实测
- 3 秒冒烟:RMS -41.2 dBFS,削波 20(均为起始瞬态),回放成功
- 10 秒正式:RMS -43.0 dBFS,退出码 0
- 10 秒正式(
mic_take2.wav,输出临时拉满 HPL=191):RMS -45.3 dBFS,退出码 0
7. 转写环境核查(未跑完)
| 端点 | 状态 |
|---|---|
pypi.org |
200 |
github.com |
200 |
hf-mirror.com |
200 |
huggingface.co |
000(不通) |
alphacephei.com/vosk/models/ |
403 |
可用 aarch64 wheel:faster-whisper 1.2.1、ctranslate2 4.8.2、onnxruntime 1.23.2、vosk 0.3.45。
pip3 install faster-whisper 执行中被关机打断,未产出任何转写文本。