引脚说明
- VDD:电源引脚,连接1.8V至3.3V的电源。
- GND:地引脚,连接电源地。
- SD:串行数据输出引脚,通过I2S接口传输数字音频数据。
- SCK:串行时钟输入引脚,用于I2S接口的时钟信号。
- WS:字选择输入引脚,用于I2S接口的帧同步信号(也称为LRCK)。
- L/R:左右声道选择引脚。当该引脚设置为低电平时,麦克风在I²S帧中输出其信号到左声道;当该引脚设置为高电平时,麦克风在I²S帧中输出其信号到右声道。
接线步骤
音频录制
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
暂无评论内容