網站首頁 編程語言 正文
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
總結
原文鏈接:https://blog.csdn.net/weixin_38468077/article/details/128486487
相關推薦
- 2023-04-24 Python中__init__的用法和理解示例詳解_python
- 2022-07-15 Sql?Server存儲過程詳解_MsSql
- 2023-10-24 記ElementUI內置的$confirm確認消息彈框方法
- 2022-10-07 C語言一個函數如何實現好幾個return返回值_C 語言
- 2022-09-07 python+selenium?實現掃碼免密登錄示例代碼_python
- 2022-09-18 ASP.NET實現文件上傳功能_實用技巧
- 2022-12-13 C++?Boost?Format超詳細講解_C 語言
- 2022-05-04 shell腳本配合zabbix實現tomcat的故障自愈功能_linux shell
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支