python常见读取语音的3种方法速度对比
作者:王延凯的博客
python已经支持WAV格式的书写,下面这篇文章主要给大家介绍了关于python常见读取语音的3种方法速度对比的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
python 读取语音文件时,常用的无非以下三种方式,但是在我们数据量变的很大是,不同的读取方式之间的性能差异就会被进一步放大,于是本文着重对比了librosa、soundfile、wavfile三种方式的在重复读取一万次某个文件所耗时间的差异,为确保实验结果的可比性,每种方式读取出的语音序列值均一致。具体数值,在下方程序结果中已经标示。
# -*- coding: utf-8 -*- """ # @Time : 2022/12/29 17:27 # @Author : WangYK # @Site : # @File : check_speed.py.py # @Software: PyCharm # @Desc: 本文件实现对比三种常见的都区语音方式的速度区别 """ import librosa import soundfile as sf from scipy.io import wavfile from time import process_time from tqdm import tqdm # 读取方式1 def librosa_loa(filename): wav_data,fs=librosa.load(filename,sr=16000) #float64类型 #wav_data:[-0.03305054 -0.03561401 -0.03814697] return wav_data,fs #读取方式2 def soundfile_load(filename): wav_data,fs=sf.read(filename) #float64类型 #wav_data:[-0.03305054 -0.03561401 -0.03814697] return wav_data #读取方式3 def wavfile_load(filename): fs,wav_data=wavfile.read(filename) #int16类型 #转为float64类型 wav_data=wav_data/(32768) #wav_data:[-0.03305054 -0.03561401 -0.038114697] return wav_data if __name__ == '__main__': filename = ['01.wav'] filenames = filename * 10000 #重复1万遍,用于对比各个方式耗时 for filename in tqdm(filenames): wav_data=soundfile_load(filename) # soundfile 读取耗时 1.7031s wav_data=librosa_loa(filename) # librosa 读取耗时 416.23s wav_data=wavfile_load(filename) # wavfile 读取耗时 1.6875s print('当前程序耗时:{:.9}s'.format(process_time()))
实验结果分析
- 最快的方式为 wavfile 的方式,一万次语音读取仅耗时 1.6875s
- 其次是 soundfile 的方式,一万次语音读取耗时 1.7031s ,与wavfile相差不大
- 最慢的为 librosa 的方式,一万次语音耗时 416s ,与其他两种方式对比,巨慢。
但是还需要注意的一点就是 soundfile的方式读取,时长会受到版本限制,例如numba等,此外如果在linux环境下进行实验,可能会出现 OSError: sndfile library not found,如果你是在内网或者连接网络不方便的话,可以选择wavfile方式读取语音文件吧。
附:语音的播放
# 音频的播放,本实验使用pyaudio(代码相对matlab较麻烦,后期简化) import pyaudio import wave chunk = 1024 wf = wave.open(r"C:\Users\zyf\Desktop\Jupyter\1.wav", 'rb') p = pyaudio.PyAudio() # 打开声音输出流 stream = p.open(format = p.get_format_from_width(wf.getsampwidth()), channels = wf.getnchannels(), rate = wf.getframerate(), output = True) # 写声音输出流到声卡进行播放 while True: data = wf.readframes(chunk) if data == "": break stream.write(data) stream.stop_stream() stream.close() p.terminate() # 关闭PyAudio
总结
到此这篇关于python常见读取语音的3种方法速度对比的文章就介绍到这了,更多相关python读取语音内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!