HarmonyOS 鸿蒙Next中录音流如何获取麦克风原始音频数据

HarmonyOS 鸿蒙Next中录音流如何获取麦克风原始音频数据 在使用Audio Kit录制音频数据的时候,指定SourceType(https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-e#sourcetype8)参数为:SOURCE_TYPE_UNPROCESSED,即可获取到麦克风采集到的纯净音频数据(系统不做任何算法处理)


更多关于HarmonyOS 鸿蒙Next中录音流如何获取麦克风原始音频数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

如果目标是拿连续 PCM 流做算法处理,建议直接用 AudioCapturer,而不是 AVRecorder 这类偏文件录制的接口。

SourceType.SOURCE_TYPE_UNPROCESSED 可以表达“尽量获取未处理音频”的诉求,但还要注意:

  1. 仍需声明并动态申请 MICROPHONE 权限。
  2. 配置采样率、声道数、sampleFormat 后,从 AudioCapturer.read 读取 PCM 数据。
  3. 不同设备/系统策略下,是否完全关闭所有前处理能力要以实际采集效果验证。
  4. 如果后续要保存成文件,需要自己补 WAV/PCM 封装或编码流程。

所以结论是:实时原始流走 AudioCapturer;录制成音频文件走 AVRecorder/录音相关封装。

更多关于HarmonyOS 鸿蒙Next中录音流如何获取麦克风原始音频数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


Audio模块下的接口支持PCM编码,包括AudioRenderer、AudioCapturer、TonePlayer、OpenSL ES等。
开发方式选择参考《如何选择音频录制开发方式》《音频录制默认打断策略表》
示例:参考鸿蒙 gitcode上。
cke_5281.png

要拿连续的麦克风 PCM 数据,建议用 AudioCapturer,而不是 AVRecorder。AVRecorder 更偏录制成文件,AudioCapturer 才适合边采集边处理。

配置时可以设置采样率、声道数、sampleFormat,并把 sourceType 设为 SOURCE_TYPE_UNPROCESSED 来请求尽量少的系统音效处理。需要注意的是,这个值更像“希望获取未处理音频”的采集源选择,不一定能保证所有设备都绕过硬件或系统链路里的处理。

实际业务里建议按 read() 读取 PCM 帧,再送到算法或编码器;同时检查麦克风权限、设备能力和采样参数是否被系统接受。

帮顶

如果是在 HarmonyOS NEXT Audio Kit 中,将录音源设置为:

sourceType: audio.SourceType.SOURCE_TYPE_UNPROCESSED

理论上表示:

请求系统提供未经 AGC(自动增益)、AEC(回声消除)、NS(降噪)等音频算法处理的原始麦克风数据。

但这里有几个容易误解的地方。


1. SOURCE_TYPE_UNPROCESSED ≠ 100% 原始 PCM

它的真实含义是:

应用请求原始音频
        ↓
Audio Framework
        ↓
HAL/驱动
        ↓
麦克风

系统会尽量关闭:

  • AEC(回声消除)
  • AGC(自动增益)
  • NS(噪声抑制)
  • Beamforming(波束成形)

但最终是否真的完全关闭:

取决于设备硬件实现。

部分设备底层 Codec 或 DSP 可能仍然存在:

  • High Pass Filter
  • DC Offset Filter
  • Mic Calibration

这些属于硬件级处理。

所以:

UNPROCESSED
≠
绝对原始ADC数据

而是:

尽可能未经系统音频算法处理

2. 如何拿到实时PCM数据

不要使用:

AVRecorder

因为它主要用于录音文件。

而应该使用:

AudioCapturer

例如:

let capturer = await audio.createAudioCapturer({
  streamInfo: {
    samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000,
    channels: audio.AudioChannel.CHANNEL_1,
    sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
    encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
  },
  capturerInfo: {
    source: audio.SourceType.SOURCE_TYPE_UNPROCESSED
  }
})

然后:

capturer.start()

let buffer = new ArrayBuffer(4096)

let readSize = await capturer.read(buffer)

此时:

buffer
↓
PCM数据
↓
YUV里的ByteBuffer类似概念

你就可以直接:

  • 声纹识别
  • ASR
  • VAD
  • RNNoise
  • WebRTC
  • AI降噪
  • 关键词检测

3. 如果做AI语音识别

推荐参数:

16kHz
Mono
PCM16

即:

samplingRate: 16000
channels: 1
sampleFormat: S16LE

这样:

  • Whisper
  • Sherpa-ONNX
  • Porcupine
  • PaddleSpeech
  • FunASR

都可以直接吃。


4. 如何验证是不是真正的原始音频

录制两份:

第一份

SOURCE_TYPE_MIC

第二份

SOURCE_TYPE_UNPROCESSED

对着风扇录音。

如果:

MIC
↓
风扇噪声明显被压制

而:

UNPROCESSED
↓
风扇噪声完整保留

说明设备支持原始采集路径。


5. HarmonyOS NEXT目前的限制

如果你的目标是:

DSP级原始麦克风数据

例如:

  • 声学定位
  • 波束成形
  • 声源分离
  • 超声波通信
  • 医疗声学分析

目前公开 Audio Kit 并没有开放:

Mic Raw ADC
DSP Bypass
Audio HAL Direct

这种级别接口。

开发者能拿到的最高级别通常就是:

AudioCapturer
+
SOURCE_TYPE_UNPROCESSED

对于大多数场景(语音识别、声纹识别、AI对话、唤醒词检测),目前 HarmonyOS NEXT 推荐方案也是:

AudioCapturer
+
SOURCE_TYPE_UNPROCESSED
+
PCM实时读取

可以直接用 AudioCapturer,它拿到的是 PCM 原始帧,不要走 AVRecorder 这类文件封装。先声明并动态申请 ohos.permission.MICROPHONE,然后配置 source 为 SOURCE_TYPE_MIC,encodingType 为 ENCODING_TYPE_RAW,sampleFormat 常用 SAMPLE_FORMAT_S16LE。

核心代码:

const capturer = await audio.createAudioCapturer(opt)
capturer.on('readData', (buf: ArrayBuffer) => { /* buf就是PCM */ })
await capturer.start()

如果要落盘,就把 ArrayBuffer 写成 .pcm,播放或算法侧按同采样率、声道数解释。结束时按 stop() -> release()。参考来源:官方《使用AudioCapturer开发音频录制功能》。

在 HarmonyOS Next 中,使用 @ohos.multimedia.audioAudioCapturer 获取麦克风原始 PCM 数据。
创建 AudioCapturer 实例,配置 audioSourceMICencodingENCODING_PCM,设置采样率、位深、通道数。
调用 start() 后通过 on('data')read() 接收原始音频缓冲区。

在 HarmonyOS Next 中,创建音频采集实例时,将 SourceType 设置为 SOURCE_TYPE_UNPROCESSED,系统即可输出麦克风原始的未经算法处理的音频数据。该参数位于 audio.AudioCapturerOptionssourceType 属性中,需与 AudioCapturer 配合使用。

回到顶部