文章目录

  • 前言
  • 一、工具
  • 1、语音合成
  • 2、语音格式转换
  • 2.1 在线转换
  • 2.2 Audition转换
  • 2.3 [SOX工具](https://sourceforge.net/projects/sox/files/sox/14.4.2/)转换
  • 二、数据处理
  • 1、使用python进行进制转换画图等数据处理验证。
  • 2、处理结果
  • 三、芯片工作流程简述
  • 参考资料



前言

接触了一块国芯的M4内核及C0子核的双核芯片,在做音频播放的时候踩了一些坑,这里记录一下使用到的调试工具及方法。
由于签署的保密协议,本文仅使用第三方调试工具,提供一些语音播放方面的思路。


一、工具

1、语音合成

语音在线合成工具

这个网址上有免费可用的在线合成工具,但是网页静态有一层蒙板,浏览器F12,懂得都懂。下载格式是MP3

实时音频 pcm 重采样 java 音频采样率在线转换_arm开发

2、语音格式转换

笔者要求的格式是wav,所以需要将上述合成的语音文件转换成wav格式。
按照自己要求选择需要修改的格式。
譬如笔者要求 8k采样率,4410波特率,8位深的wav原始文件。

2.1 在线转换

在线音频格式转换

实时音频 pcm 重采样 java 音频采样率在线转换_音频_02

2.2 Audition转换

选中音频区域,右键选区存储为:

实时音频 pcm 重采样 java 音频采样率在线转换_arm开发_03

2.3 SOX工具转换

降采样:

sox input.wav -r 16000 output.wav

位深 变为16位:

sox input.wav -b 16 output.wav

同时实现降采样与改变采样深度

sox input.wav -b 16 -r 16000 output.wav

显示音频的信息:

soxi input.wav

二、数据处理

1、使用python进行进制转换画图等数据处理验证。

import wave  
import numpy as np
import pylab as plt 
import struct

#打开wav文件 ,open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV文件的格式和数据。
f = wave.open(r"C:/Users/asdf/Desktop/wav/multi/CCM4202S_8.wav", "rb")
#读取格式信息  
#一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采样频率, 采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息
params = f.getparams()  
nchannels, sampwidth, framerate, nframes = params[:4]
print(nchannels, sampwidth, framerate, nframes)
#读取波形数据  
#读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位)  
B_data  = f.readframes(nframes)  
f.close()

#将波形数据转换成数组
#需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组  
wave_data = np.frombuffer(B_data,dtype = np.uint8)
# 位深16就采用另外一种处理 wave_data = np.frombuffer(B_data,dtype = np.uint16) + 0x8000
# 且文件写入改成'0x%04X, .......
with open("C:/Users/asdf/Desktop/wav/multi/CCM4202S_8.txt", 'w') as fin:
    fin.write(''.join(['0x%02X, ' % b for b in wave_data]))
print(len(wave_data))

2、处理结果

实时音频 pcm 重采样 java 音频采样率在线转换_mcu_04

三、芯片工作流程简述

数据结构初始化
DMA初始化,选择对应地址通道初始化,并给对应中断号分配NVIC
DAC初始化,选择右对齐12位、定时器PIT触发+上升沿触发模式
DMA-DAC关联,配置源目标地址,长度信息, DMA中断使能等
DAC启动,配置触发.

实时音频 pcm 重采样 java 音频采样率在线转换_音频_05


参考资料

1、sox工具指令-LCCFlccf