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

相关文章

流媒体平台/视频监控/安防视频汇聚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影

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

UniApp实现漂亮的音乐歌词滚动播放效果

在现代的音乐播放应用中,歌词的展示和滚动播放已经成为了一个非常常见的功能。今天,我们将通过UniApp来实现一个漂亮的歌词滚动播放功能。我们将使用UniApp提供的组件和API来完成这个任务。 页面结构 在页面的模板部分,我们需要创建一个音频播放器和歌词展示区域。使用<scroll-view>组件来实现歌词的滚动效果。 <template><view class="audio-co

WIN11 ESP32 IDF + VSCODE 环境搭建[教程向]

前言 目录 前言 安装ESP32-IDF VSCODE插件安装 编译测试 很多时候我们想学习一门新的技能,需要使用全新的开发环境,很多时候我们会在安装环境这个环节卡住很久,这里简单介绍一下ESP32+VSCODE环境搭建。 安装ESP32-IDF https://dl.espressif.cn/dl/esp-idf/?idf=4.4 直接复制上面链接,进入idf下载界面。

Vue 中实现视频播放的艺术

随着前端技术的飞速发展,视频播放在 Web 应用中已经成为了一个不可或缺的功能。从社交媒体平台到教育网站,再到在线购物平台,视频元素无处不在。而 Vue.js 作为当今最流行的前端框架之一,在实现视频播放时提供了很多强大的工具和技巧。在这篇博客中,我们将深入探讨如何使用 Vue.js 实现视频播放功能,不仅仅是简单地嵌入视频,还要添加一些高级功能,如自定义播放器控件、播放进度条、视频切换、事件处理

浅析网页不安装插件播放RTSP/FLV视频的方法

早期很多摄像头视频流使用的是RTSP、RTMP协议,播放这类协议的视频通常是在网页上安装插件。但现在越来越多的用户,对于网页安装插件比较反感,且随着移动设备的普及,用户更多的希望使用手机、平板等移动设备,直接可以查看这些协议的视频。那是否有什么方案可以直接网页打开RTSP、RTMP协议的视频,直接观看不用安装插件呢?而且对于摄像头的数据,尽可能低延迟的获取实时画面。  其实很多摄像头厂家也注意到

使用WebRtcStreamer播放rtsp视频

一、使用步骤 1.安装WebRtcStreamer包 代码如下(示例): {"name": "default","version": "0.1.0","private": true,"scripts": {"serve": "vue-cli-service serve","build": "vue-cli-service build"},"dependencies": {"core-js":

关于视频播放和下载开发的一些总结

在项目中遇到的一些问题和经验的分享: KrVideoPlayerControlView 下载地址 先从视频播放说起,视频播放是借助于第三方的demo来做参考,cc视频的一个第三方,不过真心觉得cc视频很坑。建议不要在使用! 然后,做到最后实在是被改的做不下去,自该重新寻找新的方法,进行重新开始, 然后在网上看到了一个KrVideoPlayerController 的这个