首页 > 编程语言 >六种python读取语音文件的方法

六种python读取语音文件的方法

时间:2023-08-23 19:11:22浏览次数:45  
标签:读取 python sr list 六种 0.00015259 print wav 0.00021362

该文主要记录一下常用的python读取wav文件的常用三方库以及优缺点对比,以一段采样率16k,4.99秒单声道的测试语音为例子,音频文件读取后主要有以下几种形式

#格式一:列表 [-0.00015259 -0.00021362 -0.00021362 -0.00027466 -0.00015259] float32
#格式二:列表 [-5, -7, -7, -9, -5] int16
#格式三:字节流 b'\xfb\xff\xf9\xff\xf9'   pcm编码格式
#格式四:字节流带文件头 b'RIFF\xb2\xbb\x00\x00WAVEfmt \x12\x00\x0 pcm编码格式
#格式五:字符串 'UklGRhIdAwBXQVZFZm10IBIAAAADAA' 通常是base64编码后的信息

下面介绍6种python读取语音文件的方法;

1、librosa

缺点是需要提前知道语音采样率,mono默认是True,双轨录音需注意改为False

import librosa
filepath='./zh.wav'
wav_list,sr=librosa.load(filepath,sr=16000,mono=False)
print (wav_list[:5])
#[-0.00015259 -0.00021362 -0.00021362 -0.00027466 -0.00015259]

2、soundfile

无需知道采样率,采样率是返回值

import soundfile
wav_list, sr = soundfile.read(filepath,dtype='float32')
print ("sr:"+str(sr))
print (wav_list[:5])
#[-0.00015259 -0.00021362 -0.00021362 -0.00027466 -0.00015259]

wav_list2, sr = soundfile.read(filepath,dtype='int16')
print ("sr:"+str(sr))
wav_list=wav_list2/2**15
print (wav_list[:5])
#[-0.00015259 -0.00021362 -0.00021362 -0.00027466 -0.00015259]

#文件回写
soundfile.write('zh1.wav', wav_list, 16000, subtype='PCM_16')

3、wave

该方法能返回最多语音相关信息

import wave
import numpy as np
fp = wave.open(filepath, 'rb')
byte_data = fp.readframes(fp.getnframes())  #无文件头
params = fp.getparams()
nchannels, sampwidth, sr, nframes = params[:4]
print ("音轨数:" +str(nchannels))
print ("位宽:"+str(sampwidth))
print ("采样率:"+str(sr))
print (nframes)
print ("采样点数:"+str(len(byte_data)))
wav_list= np.frombuffer(byte_data, dtype=np.int16).astype(np.float32) / 2**15     #字节流转list
print (byte_data[:5])
print (wav_list[:5])

#音轨:1
#位宽:2
#采样率:16000
#79949
#采样点数:159898
#b'\xfb\xff\xf9\xff\xf9'
#[-0.00015259 -0.00021362 -0.00021362 -0.00027466 -0.00015259]


with wave.open('zh2.wav', 'wb') as wf:
    wf.setnchannels(1)
    wf.setsampwidth(2)
    wf.setframerate(16000)
    wf.writeframes(byte_file)

4、open

该方法缺点是需要先读取成byte数据然后剔除文件头,再转换成语音list

f=open(filepath,'rb')
print ("文件头内容:"+str(f.read()[:20])) #包含文件头的bytes数据
f = open(filepath, "rb")
data = np.fromfile(f, dtype=np.int16) #包含文件头信息
wav_list=data[22:] #剔除文件头信息
wav_list=wav_list/2**15
print (wav_list[:5])
#文件头内容:b'RIFF\xbep\x02\x00WAVEfmt \x10\x00\x00\x00'
#[-0.00015259 -0.00021362 -0.00021362 -0.00027466 -0.00015259]

#如若已知文件头信息,可使用以下函数复原
import io
def audiobytes_header(audio_bytes, sample_rate=16000, fileheader=False):
    '''增加文件头方法'''
    if fileheader:
        val = audio_bytes
    else:
        fp = io.BytesIO()
        with wave.open(fp, mode='wb') as waveobj:
            waveobj.setnchannels(1)
            waveobj.setframerate(sample_rate)
            waveobj.setsampwidth(2)
            waveobj.setcomptype('NONE','NONE')
            waveobj.writeframes(audio_bytes)
            val = fp.getvalue()
    return val
    
#base64的编码与解码
import base64
f=open(filepath,'rb')
input_bytes=f.read()
base64_bytes = base64.b64encode(input_bytes)
audio = base64_bytes.decode('utf-8')
    
#input_bytes 包含文件头
#audio utf-8编码的base64加密后的字节流信息
base64_bytes=audio.encode('utf-8') #解码
byte_file = base64.b64decode(base64_bytes) #解密
wav_list=np.frombuffer(byte_file[44:], dtype=np.int16).astype(np.float32) / 2**15  #头44为文件头,需剔除
print (wav_list[:5])

5 、scipy

import scipy.io.wavfile as wavfile
sr, data = wavfile.read(filepath)
wav_list=data/2**15
print ("采样率为:"+str(sr))
print (wav_list[:5])

#采样率为:16000
#[-0.00015259 -0.00021362 -0.00021362 -0.00027466 -0.00015259]

#文件回写
audio_array = np.array(data, dtype=np.int16)
wavfile.write('output.wav', sample_rate, audio_array)

6、pydub

from pydub import AudioSegment
audio = AudioSegment.from_file(filepath)
sr = audio.frame_rate
data = audio.get_array_of_samples()
wav_list = [i/2**15 for i in list(data)]
print ("采样率:"+str(sr))
print (wav_list[:5])
#采样率为:16000
#[-0.00015259 -0.00021362 -0.00021362 -0.00027466 -0.00015259]

# 创建AudioSegment对象
audio_segment = AudioSegment(
    data=bytes(audio_data), 
    sample_width=sample_width, 
    frame_rate=sample_rate, 
    channels=num_channels
)

# 将音频数据写入文件
audio_segment.export('output.wav', format='wav')

标签:读取,python,sr,list,六种,0.00015259,print,wav,0.00021362
From: https://www.cnblogs.com/jax-/p/17652558.html

相关文章

  • python 第二天
    编程语言的发展史编程语言的分类,Python的介绍,Python的版本问题首先我们了解了计算机内部数据存储是基于二进制的语言,了解它的存储单位其次我们对编程语言的发展史列出了三点①机器语言②汇编语言二者优势均在效率高速度快难度大③高级语言通过我们能理解的高级语言引出......
  • python的重载
    python是没有重载概念的,同名的函数,最后一次的定义会覆盖原有的定义。但是通过python强大的魔法函数,实现出与C++类似的重载效果。1、参数个数不同的情况这种情况下的重载,如果直接按照C++的形式编写,是不会生效的,结果会是最后一个三参数的实现覆盖了前两个实现。deffun(a):......
  • 盘点一个pandas读取excel数据并处理的小需求
    大家好,我是皮皮。一、前言前几天在Python最强王者群【wen】问了一个pandas数据处理的问题,一起来看看吧。通过pandas读取excel数据,其中两列是交易的备注信息,对A列数据筛选并把结果输出到C列。如果A列中有['吉利','奔驰','福特']三个字段,C列标记为‘汽车品牌’,如果A列有['NIKE','......
  • Python 读取文件并统计单词出现次数
    ##py_count_words.py#py_learn##CreatedbyZ.Steveon2023/8/2310:30.#importrefromcollectionsimportCounterdefcount_words(text):#使用正则表达式将文本拆分为单词words=re.findall(r'\b\w+\b',text.lower())#转换为小写以进行不......
  • Python:箱线图的理解与绘制
    目录一、箱线图简介二、箱线图的绘制2.1基于matplotlib库的箱线图绘制2.2基于seaborn库的箱线图绘制附录Python绘图待扩展阅读一、箱线图简介如下图所示,箱线图(箱形图、盒须图)是一种基于5个统计量(上边界、上四分位数、中位数、下四分位数以及下边界)显示数据分布的标准化方法,其......
  • python-django-ORM-F查询和Q查询
    F查询如果要比较一个表中的两个不同的字段,可以使用F查询importosif__name__=='__main__':#加载Django项目的配置信息os.environ.setdefault("DJANGO_SETTINGS_MODULE","mysite2.settings")#导入Django,并启动Django项目importdjangod......
  • java 读取各种类型的文件 (三)
    后端java,springboot、前端vue:对txt文件的读写,以及前端预览一、后端读publicvoidreadTxt(){InputStreamReaderinput=null;BufferedReaderbuffer_reader=null;ArrayBlockingQueue<String[]>fileData=new......
  • java 读取各种类型的文件 (二)
    1、Filefile=newFile();参数可以是文件夹路径,也可以是文件路径;当newFile()之后只是先在内存中创建了File对象,还没有在磁盘上创建具体文件文件夹;如果参数中的文件或者文件夹已经存在的话,那么File的属性就按已存在的文件或者文件夹赋值;如果不存在则除了文件名......
  • wxpython窗口重载的一种思路(销毁重建)
    例如现在有一个dialog类:classDetailGridDialog(wx.Dialog):def__init__(self,parent,A,B,C):super().__init__(parent,title="示例",style=wx.RESIZE_BORDER|wx.DEFAULT_DIALOG_STYLE|wx.MAXIMI......
  • 如果将PC电脑变成web服务器:使用python3监测公网IP实现DDNS​
    如果将PC电脑变成web服务器:使用python3监测公网IP实现DDNS上一篇文章中,我们使用Nignx的反向代理和端口转发实现域名访问家里主机上的web了。由于家庭宽带基本都是动态IP,每当你重启一次光猫,IP地址就会变化一次。当光猫因为停电、故障、维护等原因重启过后,网站就无法访问了。网上基本......