《DNK210使用指南 -CanMV版 V1.0》第二十九章 音訊錄製實驗

正点原子發表於2024-10-12

第二十九章 音訊錄製實驗

1)實驗平臺:正點原子DNK210開發板

2)章節摘自【正點原子】DNK210使用指南 - CanMV版 V1.0

3)購買連結:https://detail.tmall.com/item.htm?&id=782801398750

4)全套實驗原始碼+手冊+影片下載地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html

5)正點原子官方B站:https://space.bilibili.com/394620890

6)正點原子K210技術交流企鵝群:605557868

本章將介紹CanMV下的音訊錄製透過CanMV提供的模組便能快速地實現音訊錄製。透過本章的學習,讀者將學習到CanMV下控制I2S獲取音訊數和audio模組的使用。
本章分為如下幾個小節:
29.1 maix.I2S模組及audio模組介紹
29.2 硬體設計
29.3 程式設計
29.4 執行驗證

29.1 maix.I2S模組及audio模組介紹
有關miax.I2S模組及audio模組的介紹,請見第28.1小節《maix.I2S模組及audio模組介紹》。

29.2 硬體設計
29.2.1 例程功能

  1. 使用maix.I2S模組和audio模組獲取板載數字麥克風的音訊資料並儲存到檔案系統中

29.2.2 硬體資源

  1. 數字麥克風
    IIS_SDIN- IO30
    IIS_BCK- IO32
    IIS_LRCK- IO33

29.2.3 原理圖
本章實驗內容,需要獲取板載數字麥克風的音訊資料,然後使用WAV編碼後儲存到檔案系統中。
DNK210開發板上的數字麥克風的連線原理圖,如下所示:


圖29.2.3.1 數字功放NS4168連線原理圖

關於該數字麥克風的使用方法,可參考MSM261S4030H0R的資料手冊——《MSM261S4030H0R.pdf》,讀者可在A盤à硬體資料à晶片資料下找到這份文件。

29.3 程式設計
29.3.1 maix.I2S模組及audio模組介紹
有關maix.I2S模組及audio模組的介紹,請見第29.1小節《maix.I2S模組及audio模組介紹》。

29.3.2 程式流程圖

圖29.3.2.1 音訊錄製實驗流程圖

29.3.3 main.py程式碼
main.py中的指令碼程式碼如下所示:

from board import board_info
from fpioa_manager import fm
from maix import GPIO
from maix import I2S
import audio
import os
try:
    os.mkdir("/sd/RECORDER")
except Exception:
    pass
SAMPLE_RATE = 16000
RECORD_TIME = 10
SINGLE_SAMPLE_POINTS = 2048
WAV_CHANNEL = 2
fm.register(board_info.SPK_CTRL, fm.fpioa.GPIO0)
fm.register(board_info.MIC_WS, fm.fpioa.I2S0_WS)
fm.register(board_info.MIC_SCLK, fm.fpioa.I2S0_SCLK)
fm.register(board_info.MIC_SDIN, fm.fpioa.I2S0_IN_D0)
# 控制數字功放進入低功耗關斷模式
spk_ctl = GPIO(GPIO.GPIO0, GPIO.OUT)
spk_ctl.value(0)
# 構造I2S物件並配置I2S通道
i2s_dev = I2S(I2S.DEVICE_0)
i2s_dev.channel_config(I2S.CHANNEL_0, I2S.RECEIVER, align_mode=I2S.STANDARD_MODE)
i2s_dev.set_sample_rate(SAMPLE_RATE)
# 構造Audio物件
audio_recorder = audio.Audio(path="/sd/RECORDER/record.wav", is_create=True, samplerate=SAMPLE_RATE)
datas = []
sample_times = (RECORD_TIME * SAMPLE_RATE) // SINGLE_SAMPLE_POINTS
for i in range(sample_times):
    # 從I2S物件獲取音訊資料
   data = i2s_dev.record(WAV_CHANNEL *SINGLE_SAMPLE_POINTS)
    if len(datas) is not 0:
       # 對音訊資料使用WAV編碼後儲存到檔案中
       audio_recorder.record(datas[0])
       datas.pop(0)
   i2s_dev.wait_record()
   datas.append(data)
# 結束音訊錄製
audio_recorder.finish()

可以看到首先是為GPIO以及I2S分配IO,然後控制數字功放NS4168的CTRL引腳為低電平,此時NS4168被配置低功耗關斷模式,避免因共用I2S介面導致數字麥克風資料傳輸出錯。

接著是構造了一個I2S物件,並配置了I2S對應的通道為接收模式,因為本實驗需要錄製音訊資料。

再接著構造了一個Audio物件,Audio物件與檔案系統中的音訊檔案進行繫結。

接下來根據定義的取樣率、錄製時間等引數不斷地從I2S物件獲取音訊資料,然後透過Audio物件對音訊資料進行WAV編碼後儲存到指定的檔案中,直到錄製到定義的錄製時間後才退出迴圈。

最後在音訊檔案錄製完畢後,結束音訊錄製,釋放音訊錄製佔用的資源。

29.4 執行驗證
將DNK210開發板連線CanMV IDE,點選CanMV IDE上的“開始(執行指令碼)”按鈕後,便開始進行音訊錄製,錄製的時長為10秒,音訊錄製完成後,外在SD卡的media資料夾下生成檔名為record.wav的音訊檔案,此時透過其他音訊播放裝置或透過上一章節音訊播放實驗中的程式播放該音訊檔案,便能聽到音訊錄製期間被錄製的音訊。

相關文章