網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
python 讀取語(yǔ)音文件時(shí),常用的無(wú)非以下三種方式,但是在我們數(shù)據(jù)量變的很大是,不同的讀取方式之間的性能差異就會(huì)被進(jìn)一步放大,于是本文著重對(duì)比了librosa、soundfile、wavfile三種方式的在重復(fù)讀取一萬(wàn)次某個(gè)文件所耗時(shí)間的差異,為確保實(shí)驗(yàn)結(jié)果的可比性,每種方式讀取出的語(yǔ)音序列值均一致。具體數(shù)值,在下方程序結(jié)果中已經(jīng)標(biāo)示。
# -*- coding: utf-8 -*-
"""
# @Time : 2022/12/29 17:27
# @Author : WangYK
# @Site :
# @File : check_speed.py.py
# @Software: PyCharm
# @Desc: 本文件實(shí)現(xiàn)對(duì)比三種常見(jiàn)的都區(qū)語(yǔ)音方式的速度區(qū)別
"""
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類(lèi)型
#wav_data:[-0.03305054 -0.03561401 -0.03814697]
return wav_data,fs
#讀取方式2
def soundfile_load(filename):
wav_data,fs=sf.read(filename) #float64類(lèi)型
#wav_data:[-0.03305054 -0.03561401 -0.03814697]
return wav_data
#讀取方式3
def wavfile_load(filename):
fs,wav_data=wavfile.read(filename) #int16類(lèi)型
#轉(zhuǎn)為float64類(lèi)型
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 #重復(fù)1萬(wàn)遍,用于對(duì)比各個(gè)方式耗時(shí)
for filename in tqdm(filenames):
wav_data=soundfile_load(filename) # soundfile 讀取耗時(shí) 1.7031s
wav_data=librosa_loa(filename) # librosa 讀取耗時(shí) 416.23s
wav_data=wavfile_load(filename) # wavfile 讀取耗時(shí) 1.6875s
print('當(dāng)前程序耗時(shí):{:.9}s'.format(process_time()))
實(shí)驗(yàn)結(jié)果分析
- 最快的方式為 wavfile 的方式,一萬(wàn)次語(yǔ)音讀取僅耗時(shí) 1.6875s
- 其次是 soundfile 的方式,一萬(wàn)次語(yǔ)音讀取耗時(shí) 1.7031s ,與wavfile相差不大
- 最慢的為 librosa 的方式,一萬(wàn)次語(yǔ)音耗時(shí) 416s ,與其他兩種方式對(duì)比,巨慢。
但是還需要注意的一點(diǎn)就是 soundfile的方式讀取,時(shí)長(zhǎng)會(huì)受到版本限制,例如numba等,此外如果在linux環(huán)境下進(jìn)行實(shí)驗(yàn),可能會(huì)出現(xiàn) OSError: sndfile library not found,如果你是在內(nèi)網(wǎng)或者連接網(wǎng)絡(luò)不方便的話(huà),可以選擇wavfile方式讀取語(yǔ)音文件吧。
附:語(yǔ)音的播放
# 音頻的播放,本實(shí)驗(yàn)使用pyaudio(代碼相對(duì)matlab較麻煩,后期簡(jiǎn)化)
import pyaudio
import wave
chunk = 1024
wf = wave.open(r"C:\Users\zyf\Desktop\Jupyter\1.wav", 'rb')
p = pyaudio.PyAudio()
# 打開(kāi)聲音輸出流
stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),
? ? ? ? ? ? ? ? channels = wf.getnchannels(),
? ? ? ? ? ? ? ? rate = wf.getframerate(),
? ? ? ? ? ? ? ? output = True)
# 寫(xiě)聲音輸出流到聲卡進(jìn)行播放
while True:
? ? data = wf.readframes(chunk)
? ? if data == "":
? ? ? ? break
? ? stream.write(data)
stream.stop_stream()
stream.close()
p.terminate() ? # 關(guān)閉PyAudio
總結(jié)
原文鏈接:https://blog.csdn.net/weixin_38468077/article/details/128486487
相關(guān)推薦
- 2022-02-17 uni-app的 tabBar添加陰影
- 2022-02-18 matplotlib的legend參數(shù)與設(shè)置
- 2022-10-27 python圖像填充與裁剪/resize的實(shí)現(xiàn)代碼_python
- 2022-05-25 yarn : 無(wú)法加載文件
- 2022-07-08 Python基礎(chǔ)篇之字符串的最全常用操作方法匯總_python
- 2022-09-13 Android?廣播接收器BroadcastReceiver詳解_Android
- 2022-06-21 Python+Django實(shí)現(xiàn)簡(jiǎn)單HelloWord網(wǎng)頁(yè)的示例代碼_python
- 2022-04-11 關(guān)于指令重排現(xiàn)象的兩個(gè)階段詳解_相關(guān)技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支