ESP32 + MicroPython + 录音 + 音频播放

2024-04-07 19:04

本文主要是介绍ESP32 + MicroPython + 录音 + 音频播放,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

功能:
  1. wav音频文件本地录音,并播放
  2. 录音模块:INMP441
  3. 音频模块:MAX98357
  4. 喇叭:3W

程序


from machine import I2S,SPI
from machine import Pinimport os, utime
import uos
import timedef createWavHeader(sampleRate, bitsPerSample, num_channels, datasize):    o = bytes("RIFF",'ascii')                                                   # (4byte) Marks file as RIFFo += (datasize + 36).to_bytes(4,'little')                                   # (4byte) File size in bytes excluding this and RIFF markero += bytes("WAVE",'ascii')                                                  # (4byte) File typeo += bytes("fmt ",'ascii')                                                  # (4byte) Format Chunk Markero += (16).to_bytes(4,'little')                                              # (4byte) Length of above format datao += (1).to_bytes(2,'little')                                               # (2byte) Format type (1 - PCM)o += (num_channels).to_bytes(2,'little')                                    # (2byte)o += (sampleRate).to_bytes(4,'little')                                      # (4byte)o += (sampleRate * num_channels * bitsPerSample // 8).to_bytes(4,'little')  # (4byte)o += (num_channels * bitsPerSample // 8).to_bytes(2,'little')               # (2byte)o += (bitsPerSample).to_bytes(2,'little')                                   # (2byte)o += bytes("data",'ascii')                                                  # (4byte) Data Chunk Markero += (datasize).to_bytes(4,'little')                                        # (4byte) Data size in bytesreturn odef start_in(sfile='s.wav', sampleRate=8000, bitsPerSample=16):bufSize=32768# 连接端口:3.3V SD->G21  WS->G22 SCK->G23  L/R-> 低电频#I2S所需管脚#数据时钟(INMP441模块SCK)sck_pin = Pin(23)#帧时钟(INMP441模块模块WS)ws_pin = Pin(22)#数据(INMP441模块模块SD)sd_pin = Pin(21)#创建用于音频录制的I2S对象audioInI2S = I2S(0,sck=sck_pin, ws=ws_pin, sd=sd_pin,mode=I2S.RX,bits=bitsPerSample,format=I2S.STEREO,rate=sampleRate,ibuf=bufSize)#音频数据读取缓冲readBuf = bytearray(bufSize)print("start ready.......")#休眠一点时间utime.sleep(2.0)# 检查文件是否存在if sfile in uos.listdir():# 删除文件print('del', sfile)uos.remove(sfile)utime.sleep(0.5)fin = open(sfile, 'wb')file_duration = 10 # 文件时长(秒)start_time = time.time()num_channels = 2f = Truehead = createWavHeader(sampleRate, bitsPerSample, num_channels, bufSize*file_duration)fin.write(head)print("in ready.......")while f:# 读取音频数据currByteCount = audioInI2S.readinto(readBuf)print('in ', len(readBuf))audio_data = bytearray()audio_data.extend(readBuf)fin.write(audio_data)# 检查是否到达文件时长if time.time() - start_time >= file_duration:f = Falsefin.close()print('in end')def start_out(sfile='s.wav', sampleRate=8000, bitsPerSample=16):if not sfile in uos.listdir():print('not found ', sfile)return# 初始化引脚定义"""GPIO13 -- DINGPIO12 --- BCLKGPIO14 -- LRCGND -- GND5V或3.3V -- VCC"""sck_pin = Pin(12) # 串行时钟输出ws_pin = Pin(14)  # 字时钟sd_pin = Pin(13)  # 串行数据输出# 初始化i2saudio_out = I2S(1, sck=sck_pin, ws=ws_pin, sd=sd_pin,mode=I2S.TX, bits=bitsPerSample, format=I2S.STEREO,rate=sampleRate, ibuf=20000)f = open(sfile,'rb')# 跳过文件的开头的44个字节,直到数据段的第1个字节pos = f.seek(44) wav_samples = bytearray(1024)wav_samples_mv = memoryview(wav_samples)print("start out ...")#并将其写入I2S DACwhile True:try:num_read = f.readinto(wav_samples_mv)# WAV文件结束if num_read == 0: break# 直到所有样本都写入I2S外围设备num_written = 0while num_written < num_read:num_written += audio_out.write(wav_samples_mv[num_written:num_read])except Exception as ret:print("产生异常...", ret)breakprint(' out end')print('start')
# 录音
start_in()
# 音频播放
start_out()
print('end')
运行日志
start
start ready.......
del s.wav
in ready.......
in  32768
in  32768
in  32768
in  32768
in  32768
in  32768
in  32768
in  32768
in end
start out ...out end
end

这篇关于ESP32 + MicroPython + 录音 + 音频播放的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/883413

相关文章

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

使用Python实现文本转语音(TTS)并播放音频

《使用Python实现文本转语音(TTS)并播放音频》在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本... 目录什么是 gTTS 和 playsound安装依赖库实现步骤 1. 导入库2. 定义文本和语言 3

详解如何使用Python提取视频文件中的音频

《详解如何使用Python提取视频文件中的音频》在多媒体处理中,有时我们需要从视频文件中提取音频,本文为大家整理了几种使用Python编程语言提取视频文件中的音频的方法,大家可以根据需要进行选择... 目录引言代码部分方法扩展引言在多媒体处理中,有时我们需要从视频文件中提取音频,以便进一步处理或分析。本文

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是