在物联网(IoT)开发领域,音频处理常常扮演着关键角色,例如智能语音助手、环境声音监测等场景都离不开音频的采集与分析。今天,我们就来深入剖析一段利用 Micropython 实现音频录制,并将录制的音频快速传输至百度语音识别服务的代码。
一、代码概述
这段 Python 代码利用 machine、urequests、ubinascii 和 network 等库,构建了一个名为 AudioRecorderAndSender 的类,实现了音频的录制、存储以及向百度语音识别服务传输的功能。整个流程一气呵成,避免了不必要的文件读写开销,旨在提高音频处理的效率。
二、代码详解
(一)类的初始化(__init__ 方法)
- def __init__(self):
- # 音频文件采样率
- self.sampleRate = 8000
- # 每音频采样比特数
- self.bitsPerSample = 16
- # 缓冲字节数
- self.bufSize = 32768
- # 一次录音数据的总字节数
- self.datasize = self.bufSize * 4
- # I2S所需管脚
- # 数据时钟
- self.sck_pin = Pin(5)
- # 帧时钟(INMP441模块模块WS)
- self.ws_pin = Pin(4)
- # 数据(INMP441模块模块SD)
- self.sd_pin = Pin(6)
- # 创建用于音频录制的I2S对象
- self.audioInI2S = I2S(0,
- sck=self.sck_pin, ws=self.ws_pin, sd=self.sd_pin,
- mode=I2S.RX,
- bits=self.bitsPerSample,
- format=I2S.STEREO,
- rate=self.sampleRate,
- ibuf=self.bufSize)
- # 音频数据读取缓冲
- self.readBuf = bytearray(self.bufSize)
- # 用于存储录制音频的字节数组
- self.recorded_audio = bytearray()
在类的初始化阶段,首先定义了一系列音频录制相关的参数,如采样率(sampleRate)为 8000Hz,每采样比特数(bitsPerSample)是 16 位,缓冲字节数(bufSize)32768 字节,这些参数决定了音频录制的质量与数据处理的粒度。同时,指定了 I2S 接口所需的管脚信息,用于硬件层面的音频数据采集连接,创建了 I2S 对象 audioInI2S 和用于暂存读取音频数据的缓冲 readBuf,以及最重要的,一个空的字节数组 recorded_audio,它将用来存储后续录制的音频数据,避免频繁写入文件。
(二)创建 WAV 文件头(createWavHeader 方法)
- def createWavHeader(self):
- o = bytes("RIFF", 'ascii') # (4byte) Marks file as RIFF
- o += (self.datasize + 36).to_bytes(4, 'little') # (4byte) File size in bytes excluding this and RIFF marker
- o += bytes("WAVE", 'ascii') # (4byte) File type
- o += bytes("fmt ", 'ascii') # (4byte) Format Chunk Marker
- o += (16).to_bytes(4, 'little') # (4byte) Length of above format data
- o += (1).to_bytes(2, 'little') # (4byte) Format type (1 - PCM)
- o += (2).to_bytes(2, 'little') # (2byte) 声道数
- o += (self.sampleRate).to_bytes(4, 'little') # (4byte) 采样率
- o += (self.sampleRate * 2 * self.bitsPerSample // 8).to_bytes(4, 'little') # (4byte)
评论记录:
回复评论: