python - 如何使用 librosa 将 .ogg opus 解码为 int16 NumPy 数组?
问题描述
我正在尝试做的事情
我正在尝试使用 Mozilla 的语音到文本引擎deepspeech转录 Telegram 音频消息。
*.wav
在 16 位 16khz 中使用完美无瑕。
我想添加*.ogg
opus 支持,因为 Telegram 使用这种格式作为它的音频消息。
到目前为止我尝试过的
到目前为止,我已经尝试过pyogg和soundfile ,但没有成功。
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.0
为1.0
. 在int16中,最大值为32767
. 所以你必须乘以缩放信号,然后转换为int16。
data, sample_rate = librosa.load(path)
int16 = (data * 32767).astype(np.int16)
metadata = model.sttWithMetadata(int16)
快速解释为什么 32767:
在16 位计算中,一个整数可以存储 216 个不同的值。
这意味着,无符号整数的范围可以从 0 到 65,535,而两个补码表示可以从 -32,768 到 32,767。这意味着,具有 16 个机器人内存地址的处理器一次可以访问 64KB(或 64 * 1024 = 65,436 个唯一地址)的内存。
如果我们的浮点数组具有从 -1.0 到 1.0 的值,我们将信号缩放 32,767 倍,以使其与您的 deepspeech 模型期望找到的 16 位地址兼容。
推荐阅读
- r - 如何将函数应用于向量中的每个连续 n 元素
- c++ - 如何在 C++ 中使用 gradle 添加仅标头依赖项
- java - 如何在 Spring Boot 中使用具有不同 Content-Type 的 SOAP 1.2
- nativescript - tns 构建给出致命错误:无效标记压缩接近堆限制分配失败 - JavaScript 堆内存不足
- terminology - noddy代码测试原理是什么
- angular - 为什么 request.ts 中的 serializeBody 方法在 case 字符串中不转换 JSON.stringify(this.body)?
- node.js - 如何使用此功能运行功能
- scala - 使用 foreach 进行 Spark 结构化流式处理
- javascript - 在 HTML 5 输入中调用 id 时未定义
- python-3.x - 是否可以再次将 .exe 重新转换为 python3-Script?