Python | 语音处理 | 用 librosa / AudioSegment / soundfile 读取音频文件的对比

这篇具有很好参考价值的文章主要介绍了Python | 语音处理 | 用 librosa / AudioSegment / soundfile 读取音频文件的对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文对比用 Python 读取音频文件 (.wav, .mp3) 的三种方式:

  • soundfile.read
  • librosa.load
  • pydub.AudioSegment.from_file

使用总结如下:

  1. soundfile.read

    • 只能读 .wav ,不能读 .mp3;
    • 默认 dtype = 'float64',输出为 (-1, 1) 之间的数据 (做了 32768 归一化);修改为 dtype = 'int16',输出为 (-2**15, 2**15-1) 之间;
    • 保留原始采样频率。
  2. librosa.load

    • 可以读 .wav 和 .mp3;
    • 输出为 (-1, 1);
    • sr=None 保留原始采样频率,设置其他采样频率会进行重采样,有点耗时;
  3. pydub.AudioSegment.from_file:

    • 可以读 .wav 和 .mp3;
    • 输出为 (-2**15, 2**15-1),手动除以32768(=2**15),可得到同2一样的结果;
    • 保留原始采样频率,重采样可借助 librosa.resample

1) soundfile.read

只能读 .wav 格式, 读 .mp3 会报错。

基本使用示例如下:

import soundfile as sf
import time

audio_path = './data/example.wav'

t = time.time()
wav, sr = sf.read(audio_path)
print(f"sr={sr}, len={len(wav)}, 耗时: {time.time()-t}")
print(f"(min, max, mean) = ({wav.min()}, {wav.max()}, {wav.mean()}), dtype={wav.dtype}")
wav
sr=16000, len=64320, 耗时: 0.08734607696533203
(min, max, mean) = (-0.027984619140625, 0.032623291015625, -2.017282134857937e-05), dtype=float64
array([ 0.00000000e+00,  0.00000000e+00, -6.10351562e-05, ...,
       -3.05175781e-05,  6.10351562e-05, -1.22070312e-04])

sf.read 有个参数 dtype, 文档如下:

    dtype : {'float64', 'float32', 'int32', 'int16'}, optional
        Data type of the returned array, by default ``'float64'``.
        Floating point audio data is typically in the range from
        ``-1.0`` to ``1.0``.  Integer data is in the range from
        ``-2**15`` to ``2**15-1`` for ``'int16'`` and from ``-2**31`` to
        ``2**31-1`` for ``'int32'``.
  1. 为 ‘float64’ 或 ‘float32’ 时,得到的是 (-1, 1) 之间做了归一化的数据,默认为此项;
  2. 为 ‘int16’ 时,得到的是 (-32768, 32767) 的数据;除以 32768(=2**15) 之后得到的结果等同于 1;
  3. 为 ‘int32’ 时,得到的是 (-2147483648, 2147483647) 的数据;除以 2147483648(=2**31) 之后得到的结果等同于 1;
t = time.time()
wav, sr = sf.read(audio_path, dtype='int16')
print(f"sr={sr}, len={len(wav)}, 耗时: {time.time()-t}")
print(f"(min, max, mean) = ({wav.min()}, {wav.max()}, {wav.mean()}), dtype={wav.dtype}")
wav
sr=16000, len=64320, 耗时: 0.0010836124420166016
(min, max, mean) = (-917, 1069, -0.6610230099502488), dtype=int16
array([ 0,  0, -2, ..., -1,  2, -4], dtype=int16)
wav / (2**15)
array([ 0.00000000e+00,  0.00000000e+00, -6.10351562e-05, ...,
       -3.05175781e-05,  6.10351562e-05, -1.22070312e-04])
t = time.time()
wav, sr = sf.read(audio_path, dtype='int32')
print(f"sr={sr}, len={len(wav)}, 耗时: {time.time()-t}")
print(f"(min, max, mean) = ({wav.min()}, {wav.max()}, {wav.mean()}), dtype={wav.dtype}")
wav
sr=16000, len=64320, 耗时: 0.0007898807525634766
(min, max, mean) = (-60096512, 70057984, -43320.8039800995), dtype=int32
array([      0,       0, -131072, ...,  -65536,  131072, -262144],
      dtype=int32)
wav / (2**31)
array([ 0.00000000e+00,  0.00000000e+00, -6.10351562e-05, ...,
       -3.05175781e-05,  6.10351562e-05, -1.22070312e-04])

2) librosa.load

基本使用如下:

import librosa
import numpy as np
import time

# audio_path = './data/example.mp3'
audio_path = './data/example.wav'

# librosa.load 读取
t = time.time()
wav, sr = librosa.load(audio_path, sr=None)
print(f"sr={sr}, len={len(wav)}, 耗时: {time.time()-t}")
print(f"(min, max, mean) = ({wav.min()}, {wav.max()}, {wav.mean()})")
wav
sr=16000, len=64320, 耗时: 0.0007445812225341797
(min, max, mean) = (-0.027984619140625, 0.032623291015625, -2.0172821677988395e-05)
array([ 0.0000000e+00,  0.0000000e+00, -6.1035156e-05, ...,
       -3.0517578e-05,  6.1035156e-05, -1.2207031e-04], dtype=float32)

librosa.load 的源码会发现其底层用的也是 soundfile.read :
python读取音频什么格式,音频处理,python,语音识别

但是需要注意:

  1. librosa.load会优先使用soundfile.read读取,但其只能读 .wav , 如果传入 .mp3 会报错;这时候会报 warning,然后使用 __audioread_load 方法读取,该方法在源码中如是说:
  /data/miniconda3/lib/python3.9/site-packages/librosa/core/audio.py:162: UserWarning: PySoundFile failed. Trying audioread instead.warnings.warn("PySoundFile failed. Trying audioread instead.")
  Open an audio file using a library that is available on this system.
  1. 同样有默认参数dtype=np.float32,输出为 (-1, 1) 的数据。但是笔者发现,传入 .wav 时,把 dtype 设置为 int16int32 时会报错,不太好使。读者可自行尝试。报错内容为:

    ParameterError: Audio data must be floating-point
    
  2. 默认参数 sr=None,会使用音频原始的采样频率;但是如果设置了与其不一样的频率,则会进行重采样(librosa.resample),此时会花费较长的时间。重采样之后 wav 的长度也会相应地改变。

# audio_path = './data/example.wav'
audio_path = './data/example.mp3'

# librosa.load 读取
print("不设置 sr (uses the native sampling rate)")
t = time.time()
wav, sr = librosa.load(audio_path, sr=None)
print(f"sr={sr}, len={len(wav)}, 耗时: {time.time()-t}")
print(f"(min, max, mean)=({wav.min()}, {wav.max()}, {wav.mean()})")
print(wav)

print("====================================================================")

print("设置了与原始不一样的 sr 时, 会进行重采样(librosa.resample)")
t = time.time()
wav, sr = librosa.load(audio_path, sr=22050)
print(f"sr={sr}, len={len(wav)}, 耗时: {time.time()-t}")
print(f"(min, max, mean) = ({wav.min()}, {wav.max()}, {wav.mean()})")
wav
不设置 sr (uses the native sampling rate)
sr=16000, len=64320, 耗时: 0.08281397819519043
(min, max, mean)=(-0.026611328125, 0.0225830078125, -1.8552998881204985e-05)
[ 3.0517578e-05 -3.0517578e-05 -6.1035156e-05 ... -3.0517578e-05
  3.0517578e-05 -6.1035156e-05]
====================================================================
设置了与原始不一样的 sr 时, 会进行重采样(librosa.resample)
/data/miniconda3/lib/python3.9/site-packages/librosa/core/audio.py:165: UserWarning: PySoundFile failed. Trying audioread instead.
  warnings.warn("PySoundFile failed. Trying audioread instead.")
sr=22050, len=88641, 耗时: 0.6544580459594727
(min, max, mean) = (-0.02733371965587139, 0.028146227821707726, -1.8553111658548005e-05)
array([ 2.7023052e-05, -6.1948767e-06, -5.5695422e-05, ...,
        2.9699471e-05, -2.1948585e-05, -5.6789420e-05], dtype=float32)

3) pydub.AudioSegment.from_file

基本使用如下:

from pydub import AudioSegment #需要导入pydub三方库,第一次使用需要安装

audio_path = './data/example.mp3'

t = time.time()
song = AudioSegment.from_file(audio_path, format='mp3')
# print(len(song)) #时长,单位:毫秒
# print(song.frame_rate) #采样频率,单位:赫兹
# print(song.sample_width) #量化位数,单位:字节
# print(song.channels) #声道数,常见的MP3多是双声道的,声道越多文件也会越大。
wav = np.array(song.get_array_of_samples())
sr = song.frame_rate
print(f"sr={sr}, len={len(wav)}, 耗时: {time.time()-t}")
print(f"(min, max, mean) = ({wav.min()}, {wav.max()}, {wav.mean()})")
wav
sr=16000, len=64320, 耗时: 0.04667925834655762
(min, max, mean) = (-872, 740, -0.6079446517412935)
array([ 1, -1, -2, ..., -1,  1, -2], dtype=int16)

输出为 (-2**15, 2**15-1) 的 int16。除以 32768 之后的结果同 librosa.load:

wav = wav / 32768
wav
array([ 3.05175781e-05, -3.05175781e-05, -6.10351562e-05, ...,
       -3.05175781e-05,  3.05175781e-05, -6.10351562e-05])

结果会保留原始采样频率,如果想改为其它频率可以借助 librosa 进行重采样:

new_wav = librosa.resample(wav.astype(np.float32), 16000, 22050)
print(new_wav.shape)
new_wav
(88641,)
array([ 2.7023052e-05, -6.1948767e-06, -5.5695422e-05, ...,
        2.9699471e-05, -2.1948585e-05, -5.6789420e-05], dtype=float32)

一些其他参考:文章来源地址https://www.toymoban.com/news/detail-633045.html

  • https://blog.csdn.net/weixin_38468077/article/details/106896485
  • https://blog.csdn.net/qq_37100442/article/details/110092393
  • https://www.programcreek.com/python/example/89506/pydub.AudioSegment.from_file

到了这里,关于Python | 语音处理 | 用 librosa / AudioSegment / soundfile 读取音频文件的对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小蜗语音工具1.9、文本,小说,字幕生成语音、多角色对话,语音识别、读取音频字幕

    可以把正本小说,生成字幕文件。不限制文件的大小 a、 分割字符 :默认通过**,。!–:?“”** 来把内容分割成一句一句的字幕,可以自定义 b、 删除符号 :默认删除【】=、等符号,删除内容里面的这些特殊符号并且替换为空格,可以自定义 c、 删除文字 : 第(. )章(

    2024年02月10日
    浏览(51)
  • Librosa库——语音识别,语音音色识别训练及应用

    很多同学以为语音识别是非常难的,其实并不然,起初我也是这么认为,但后来发现语音识别是最简单的,因为同学们可能不知道Python有一个音频处理库Librosa,这个库非常的强大,可以进行音频处理、频谱表示、幅度转换、时频转换、特征提取(音色、音高提取)等等,关于

    2024年02月08日
    浏览(38)
  • 语音信号处理 —— 笔记(一)音频信号处理

      声音的产生 :能量通过声带使其振动产生一股基声音,这个基声音通过声道 ,与声道发生相互作用产生共振声音,基声音与共振声音一起传播出去。 传感器以 某种频率 探测声音的振幅强度以及振动方向,所得到的一系列随时间变化的点。 传感器的探测频率,即为采样

    2023年04月09日
    浏览(52)
  • 语音识别与语音合成:机器学习在音频处理领域的应用

    语音识别和语音合成是人工智能领域的两个重要应用,它们在日常生活和工作中发挥着越来越重要的作用。语音识别(Speech Recognition)是将语音信号转换为文本信息的技术,而语音合成(Text-to-Speech Synthesis)是将文本信息转换为语音信号的技术。这两个技术的发展与机器学习紧密相

    2024年02月21日
    浏览(47)
  • 1分钟了解音频、语音数据和自然语言处理的关系

    音频、语音数据和自然语言处理这三者正在不断促进人工智能技术的发展,人机交互也逐渐渗透进生活的每个角落。在各行各业包括零售业、银行、食品配送服务商)的多样互动中,我们都能通过与某种形式的AI(如聊天机器人或虚拟助手)沟通来实现某些交易活动。语言是

    2024年02月09日
    浏览(47)
  • AI机器学习 | 基于librosa库和使用scikit-learn库中的分类器进行语音识别

    专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https://blog.csdn.net/superdangbo/category_9271502.html tensorflow专栏:https://blog.csdn.net/superdangbo/category_869

    2024年02月05日
    浏览(42)
  • [语音识别] 基于Python构建简易的音频录制与语音识别应用

    语音识别技术的快速发展为实现更多智能化应用提供了无限可能。本文旨在介绍一个基于Python实现的简易音频录制与语音识别应用。文章简要介绍相关技术的应用,重点放在音频录制方面,而语音识别则关注于调用相关的语音识别库。本文将首先概述一些音频基础概念,然后

    2024年02月12日
    浏览(45)
  • 使用Python进行语音识别:将音频转为文字

    语音识别是一项将语音信号转换为可理解的文本的技术。在Python中,我们可以使用一些库和工具来实现语音识别,并将音频转换为文本。本文将介绍如何使用Python进行语音识别的过程,并提供相应的源代码。 步骤1:安装所需的库 首先,我们需要安装一些Python库来支持语音识

    2024年02月03日
    浏览(54)
  • 语音识别系列︱用python进行音频解析(一)

    笔者最近在挑选开源的语音识别模型,首要测试的是百度的paddlepaddle; 测试之前,肯定需要了解一下音频解析的一些基本技术点,于是有此篇先导文章。 笔者看到的音频解析主要有几个: soundfile ffmpy librosa 安装代码: 参考文档:librosa 文档位置:https://librosa.org/doc/latest/co

    2024年02月02日
    浏览(47)
  • 【音频】python读取写入wav文件

    使用librosa库: librosa.load(文件路径,采样率sampling rate) 直接用librosa的函数 librosa.output.write_wav(\\\'output.wav\\\', y, sr) 会报错: \\\"AttributeError: module \\\'librosa\\\' has no attribute \\\'output\\\'\\\" 。 这是因为librosa库在0.8.0版本后把这个函数删掉了,我们可以用soundfile库的soundfile.write()函数达到同样的目的

    2024年02月03日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包