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

相关文章

用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 还是

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影