如何使用 librosa 将 .ogg opus 解码为 int16 NumPy 数组?

How to decode .ogg opus to int16 NumPy array with librosa?

我想做什么

我正在尝试使用 Mozillas 语音到文本引擎转录 Telegram 音频消息 deepspeech

在 16 位 16khz 中使用 *.wav 工作完美。

我想添加 *.ogg opus 支持,因为 Telegram 的音频消息使用这种格式。

到目前为止我尝试了什么

到目前为止,我已经尝试 pyogg and soundfile,但没有成功。

声音文件完全无法读取 opus 格式,而且如果没有 conda,安装 pyogg 会很痛苦。我有过非常奇怪的时刻,它真的崩溃了 python。

现在,我正在尝试 librosa,结果好坏参半。

data, sample_rate = librosa.load(path)

tmp = np.array(data, np.float16)

tmp.dtype = np.int16

int16 = np.array(tmp, dtype=np.int16)

metadata = model.sttWithMetadata(int16)

Deepspeech 非常喜欢np.int16model.sttWithMetadata本质上是对抄写员的呼吁。

目前,它确实转录了一些内容,但与我在音频消息中所说的内容相去甚远。

librosa returns 数组在 -1.01.0 范围内浮动。在 int16 中最大值为 32767。所以你必须乘以缩放信号,然后转换为 int16.

data, sample_rate = librosa.load(path)

int16 = (data * 32767).astype(np.int16)

metadata = model.sttWithMetadata(int16)

快速解释为什么是 32767:

16-bit computing中,一个整数可以存储216个不同的值。

这意味着,无符号整数的范围为 0 到 65,535,二进制补码表示的范围为 -32,768 到 32,767。这意味着,具有 16 个 bot 内存地址的处理器一次可以访问 64KB(或 64 * 1024 = 65,436 个唯一地址)的内存。

如果我们的浮点数组有值,范围从 -1.0 到 1.0,我们将信号缩放 32,767 倍,使其与您的 deepspeech 模型期望找到的 16 位地址兼容。