micropython ESP32 使用INMP441麦克风录音

20240819205154944-Screenshot_2024-08-19-20-51-34-368_com.xunmeng.pi

 

引脚说明

  1. VDD:电源引脚,连接1.8V至3.3V的电源。
  2. GND:地引脚,连接电源地。
  3. SD:串行数据输出引脚,通过I2S接口传输数字音频数据。
  4. SCK:串行时钟输入引脚,用于I2S接口的时钟信号。
  5. WS:字选择输入引脚,用于I2S接口的帧同步信号(也称为LRCK)。
  6. L/R:左右声道选择引脚。当该引脚设置为低电平时,麦克风在I²S帧中输出其信号到左声道;当该引脚设置为高电平时,麦克风在I²S帧中输出其信号到右声道。

接线步骤

  1. 首先,确认你的 ESP32 开发板上的引脚标识。不同的开发板可能会有略微不同的引脚布局,但一般都会在板子上标明引脚编号。
  2. 将 INMP441 的相应引脚连接到 ESP32 的指定引脚:
    • INMP441 的时钟输出引脚连接到 ESP32 的 bck_pin(23 号引脚)。
    • INMP441 的字时钟引脚连接到 ESP32 的 ws_pin(22 号引脚)。
    • INMP441 的数据输出引脚连接到 ESP32 的 sdin_pin(21 号引脚)。
  3. 确保连接稳定可靠,可以使用杜邦线进行连接,并检查引脚是否插紧。
  4. 根据你的电路设计,可能还需要连接其他必要的组件,如电源和地线。确保电源供应稳定,并正确连接地线以避免干扰。

音频录制

from machine import Pin
from machine import I2S
import time
import struct

bck_pin = Pin(23)
ws_pin = Pin(22)
sdin_pin = Pin(21)
audio_in = I2S(0,
               sck=bck_pin, ws=ws_pin, sd=sdin_pin,
               mode=I2S.RX,
               bits=16,
               format=I2S.MONO,
               rate=8000,
               ibuf=32768)

chunk_size = 512  # 每个分片的大小
chunks = []  # 用于存储分片数据的列表

print('Starting')

start_time = time.ticks_ms()
while time.ticks_ms() - start_time < 3000:  # 录制 5 秒
    ibuf = bytearray(chunk_size)
    num_read = audio_in.readinto(ibuf)
    chunks.append(ibuf)

audio_in.deinit()

all_data_sent = False  # 标志,初始化为未发送完

# 创建 WAV 文件头
riff_chunk_id = b'RIFF'
riff_chunk_size = 36 + len(b''.join(chunks))
riff_format = b'WAVE'

fmt_chunk_id = b'fmt '
fmt_chunk_size = 16
audio_format = 1  # PCM
num_channels = 1
sample_rate = 8000
byte_rate = sample_rate * num_channels * 2
block_align = num_channels * 2
bits_per_sample = 16

data_chunk_id = b'data'
data_chunk_size = len(b''.join(chunks))

# 保存音频数据为文件
with open('recorded_audio.wav', 'wb') as f:
    f.write(riff_chunk_id)
    f.write(struct.pack('<I', riff_chunk_size))
    f.write(riff_format)
    f.write(fmt_chunk_id)
    f.write(struct.pack('<I', fmt_chunk_size))
    f.write(struct.pack('<H', audio_format))
    f.write(struct.pack('<H', num_channels))
    f.write(struct.pack('<I', sample_rate))
    f.write(struct.pack('<I', byte_rate))
    f.write(struct.pack('<H', block_align))
    f.write(struct.pack('<H', bits_per_sample))
    f.write(data_chunk_id)
    f.write(struct.pack('<I', data_chunk_size))
    f.write(b''.join(chunks))
© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容