DanDock-AI之(录制和播放声音)

153 阅读1分钟

硬件说明

今天仔细看了一下dan dock的硬件,发现有一个小的贴片mic。还有一个功放。
查看官方的手册,可以推动2*3W的扬声器,比较奈斯。下面来搞一下这个声音的录制吧。
后续有更高的需求的话,可以购买官方的mic阵列。

硬件

原理图分析

image.png 根据原理图可知: mic接入引脚:

  • data 31
  • ws 30
  • clk 32 喇叭引脚:
  • data 34
  • ws 33
  • clk 35

焊接喇叭

硬件上,默认并没有焊接扬声器,我们找到扬声器的接口,L,R 接一个喇叭,如图:

image.png

焊接over:

a830ed5e3366eaa178bff6d5df7cd9b.jpg

录音

录音,初始化iis后,调整参数,录制的格式是wav格式。这个和正常的录音程序是一样的。

code

我并没有插入sd卡,所以我把录音的文件放到了同路径下。

import time
import audio
from Maix import GPIO, I2S
from fpioa_manager import fm

# user setting
sample_rate   = 16000
record_time   = 4 
sample_points = 2048
wav_ch        = 2
#禁用wifi
fm.register(8,  fm.fpioa.GPIO0, force=True)
wifi_en = GPIO(GPIO.GPIO0, GPIO.OUT)
wifi_en.value(0)
#输入配置
fm.register(31,fm.fpioa.I2S0_IN_D0, force=True)
fm.register(30,fm.fpioa.I2S0_WS, force=True)   
fm.register(32,fm.fpioa.I2S0_SCLK, force=True) 
rx = I2S(I2S.DEVICE_0)
rx.channel_config(rx.CHANNEL_0, rx.RECEIVER, align_mode=I2S.STANDARD_MODE)
rx.set_sample_rate(sample_rate)
print(rx)
# init audio
recorder = audio.Audio(path="record.wav", is_create=True, samplerate=sample_rate)
queue = []
frame_cnt = record_time*sample_rate//sample_points
for i in range(frame_cnt):
    tmp = rx.record(sample_points*wav_ch)
    if len(queue) > 0:
        ret = recorder.record(queue[0])
        queue.pop(0)
    rx.wait_record()
    queue.append(tmp)
    print(str(i) + ":" + str(time.ticks()))

recorder.finish()

结果

image.png

因为dan的调试并没有支持shell指令,那么我们还需要使用一个小的程序看一下我们当前目录下是否已经录制成功了。

code

import os

f=os.listdir()
print(f)

效果

image.png

采集声音并播放

from Maix import GPIO, I2S
import image, lcd, math
import audio
from fpioa_manager import fm

sample_rate = 22050
sample_points = 1024

fm.register(8, fm.fpioa.GPIO0, force=True)
wifi_en = GPIO(GPIO.GPIO0, GPIO.OUT)
wifi_en.value(0)

rx = I2S(I2S.DEVICE_0)
rx.channel_config(I2S.CHANNEL_0, 
                  rx.RECEIVER, 
                  resolution = I2S.RESOLUTION_16_BIT, 
                  cycles = I2S.SCLK_CYCLES_32, 
                  align_mode = I2S.STANDARD_MODE)
rx.set_sample_rate(sample_rate)
fm.fpioa.set_function(pin=31, func=fm.fpioa.I2S0_IN_D0)
fm.fpioa.set_function(pin=30, func=fm.fpioa.I2S0_WS)
fm.fpioa.set_function(pin=32, func=fm.fpioa.I2S0_SCLK)


tx = I2S(I2S.DEVICE_2)
tx.channel_config(I2S.CHANNEL_1, 
                  I2S.TRANSMITTER, 
                  resolution = I2S.RESOLUTION_16_BIT, 
                  cycles = I2S.SCLK_CYCLES_32, 
                  align_mode = I2S.RIGHT_JUSTIFYING_MODE)
tx.set_sample_rate(sample_rate)
fm.fpioa.set_function(pin=34, func=fm.fpioa.I2S2_OUT_D1)
fm.fpioa.set_function(pin=35, func=fm.fpioa.I2S2_SCLK)
fm.fpioa.set_function(pin=33, func=fm.fpioa.I2S2_WS)

while True:
    tx.play(rx.record(sample_points))