使用Librosa获取音频的基本参数

6

通过 Wave 获取音频文件的基本参数:

import wave

data = wave.open('c:\\sample.wav', mode = 'rb')
params = data.getparams()
print params

它会返回:

(1, 2, 4000, 160000, 'NONE', 'not compressed')

针对:nchannels=1, sampwidth=2, framerate=16000, nframes=47104, comptype='NONE', compname='not compressed'

我认为Librosa有类似的功能,但是在搜索后没有找到相关结果。

Librosa是否有命令可以生成类似的结果?

谢谢。


1
据我所知,librosa本身只是包装其他库(如audioread)来解码音频。librosa的重点绝不是提供这种信息。 - Hendrik
2个回答

7

Librosa核心 具有您需要的某些功能。 librosa.core.load 会像 wave 一样加载文件,但不会提供详细信息。

import librosa

# Load an example file in .ogg format
fileName = librosa.util.example_audio_file()
audioData, sampleRate = librosa.load(fileName)

print(audioData)
>>> [ -4.756e-06,  -6.020e-06, ...,  -1.040e-06,   0.000e+00]

print(audioData.shape)
>>> (1355168,)

print(sampleRate)
>>> 22050
audioData 的形状将告诉您声道数量。类似 (n,) 的形状是单声道,(2, n) 的形状是立体声。形状中的 n 是音频采样长度。如果要获取以秒为单位的长度,请查看 librosa.core.get_duration
正如 @hendrick 在他的评论中提到的,Librosa 高级 I/O 页面 表明 librosa 使用 soundfileaudioread 进行音频输入输出,而 load 源代码 显示它只是对这些库进行了包装。
然而,只要按照 librosa API,使用 wave 加载音频文件并使用 librosa 进行分析就不应该有任何问题。您遇到了特定的问题或需要实现特定的目标吗?

1
感谢您分享知识。目前还没有具体的问题,只是出于兴趣。 :) - Mark K
只是提醒一下:在v0.7中,您应该使用mono=False参数。 - akashrajkn
这种方法需要读取文件。@MarkK,wave.open().getparams()也是这种情况吗? Librosa是否提供了一种无需读取文件即可获取参数的方法? - Thiago Gouvea
@ThiagoGouvea,从文件中读取信息似乎是一种通常的方法。所以我觉得无论使用哪种方法读取文件都可以。 :) - Mark K
我应该更加精确:librosa.load() 似乎读取整个文件内容,而当你只需要获取所需的元数据时,读取 头文件应该就足够了。这在尝试仅获取大量文件的元数据时可能会产生很大的差异(这是我的情况,也可能是许多人来到此页面的情况)。 - Thiago Gouvea
无论磁盘上的音频内容如何,此操作将始终以22,050 Hz的单声道文件返回。 - undefined

1

librosa在0.10.1版本中没有特定的函数来加载音频文件的元数据。有一些函数可以获取单独的信息片段,即get_samplerate(path)get_duration(*, path, ...)(返回的是以秒为单位的持续时间,而不是样本数),但仅限于此。

要获取通道数,您必须加载文件,然后检查音频的形状。然而,当您加载文件时,librosa在幕后做了很多事情:默认情况下,它会将信号转换为单声道和22,050 Hz。如果您想按照存储在磁盘上的方式读取文件,您必须以以下方式读取:

import librosa as lr

audio_fp = "path/to/audio/file"
duration = lr.get_duration(path=audio_fp)
audio, sr = lr.load(audio_fp, sr=None, mono=False, duration=0.01)
# n_samples is approximate, but should be correct most of the times
n_samples = int(round(duration * sr))
if audio.ndim == 1:
  channels = 1
else:
  channels = audio.shape[0]
duration关键字要求librosa只读取音频的前0.01秒,这足以找出通道数。这可以极大地加快处理过程,特别是在处理长文件时。
一些%timeit魔法显示,wave方法需要约26微秒,而librosa堆栈需要约99微秒。在60分钟的音轨上不使用duration关键字需要约221毫秒(这是毫秒,不是微秒——比慢了一千多倍)。librosa的一个优点是它可以透明地处理编码文件,如mp3和flac,性能只有轻微的损失(约125微秒)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接