繁体   English   中英

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

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

我正在尝试做的事情

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

在 16bit 16khz 中使用*.wav完美无缺。

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

到目前为止我所尝试的

到目前为止,我已经尝试过pyoggsoundfile ,但没有成功。

Soundfile 可能完全无法读取 opus 格式,并且 pyogg 在没有 conda 的情况下安装起来很痛苦。 我有非常奇怪的时刻,它真的崩溃了 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.int16 model.sttWithMetadata本质上是对转录器的调用。

现在,它确实转录了一些东西,但与我在音频信息中所说的内容相去甚远。

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

data, sample_rate = librosa.load(path)

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

metadata = model.sttWithMetadata(int16)

快速解释为什么 32767:

16 位计算中,一个 integer 可以存储 216 个不同的值。

这意味着,无符号整数的范围可以从 0 到 65,535,而两个补码表示可以从 -32,768 到 32,767。 这意味着,具有 16 个机器人 memory 地址的处理器一次可以访问 64KB(或 64 * 1024 = 65,436 个唯一地址)的 memory。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM