日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

python常見讀取語音的3種方法速度對比_python

作者:王延凱的博客 ? 更新時間: 2023-02-06 編程語言

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

欄目分類
最近更新