手机录一段声音,用python分析——加载和显示

仅作为操作记录,大佬请跳过。

文章目录

背景:博主的matlab 2019a 不能使用enframe函数,发现没有安装voice toolbox包,还是用python吧

流程

1、华为手机录一段语音,是.m4a格式。保存到电脑上。

2、需要转换成.wav格式

可在线转换,在这里先将M4A格式转MP3,再在这里将MP3转WAV格式

3、pycharm中写python代码

可直接运行

(博主的音频文件命名为了clear.wav,保存在E盘的document文件夹下)

import wave
import numpy as np
from matplotlib.pyplot import *

f=wave.open(r'E:\document\clear.wav','rb')
params=f.getparams()

nchannels, sampwidth, framerate, nframes = params[:4]

str_data=f.readframes(nframes)

# print(len(str_data)) # 二进制数的长度 =十六进制长度*4
wave_data=np.fromstring(str_data,dtype=np.short) # 归一化 wave_data=wave_data/max(abs(wave_data))
# print(wave_data.shape);wave_data.shape=-1,2;print(wave_data.shape)
# print(len(wave_data))
wave_data.shape=-1,2
wave_data=wave_data.T
# wave_data.shape=2,-1

time=np.arange(0,nframes)*(1/framerate)

# plot(time,wave_data[0]);show()
subplot(211)
plot(time, wave_data[0])
subplot(212)
plot(time, wave_data[1], c="g")
xlabel("time (seconds)")
show()
print('ok')

即可

展示

在这里插入图片描述
发现与华为手机上的录音截屏基本一样:

在这里插入图片描述
————————————————————————————————————————————————————

(1)f.getparams()可以直接分析出音频的采样率和采样点数

在这里插入图片描述
(2)f.readframes(nframes)得到音频的数字信息,是二进制数

(3)华为手机录的音是双声道,也就是左扬声器和右扬声器。也就是采样点数是256000,但实际点数是512000(左1右1左2右2左3右3左4……)(=256000*2)——所以画时频图时,选取一侧(左侧或右侧)的全部值进行显示即可。

华为手机是双声道,其他的录音器可能不是,由(1)中f.getparams()算出的nchannel可知
在这里插入图片描述
(4)提取左侧全部值

一定要用:
wave_data.shape=-1,2和wave_data=wave_data.T的方式(这样是2,4,6,8……分隔提取)
在这里插入图片描述
不能用wave_data.shape=2,-1 ,这样是(2,3,4,5,6)提取。


参考

感谢大佬博主文章

传送门

传送门2

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值