【问题标题】:How to decode .ogg opus to int16 NumPy array with librosa?如何使用 librosa 将 .ogg opus 解码为 int16 NumPy 数组?
【发布时间】:2020-10-13 14:44:53
【问题描述】:

我想要做什么

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

在 16 位 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.int16model.sttWithMetadata 本质上是对抄写员的呼吁。

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

【问题讨论】:

    标签: python python-telegram-bot ogg librosa mozilla-deepspeech


    【解决方案1】:

    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-bit computing 中,一个整数可以存储 216 个不同的值。

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

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

    【讨论】:

    • 这正是我所需要的。我用sounddevice as sd 调用sd.play(int16, sample_rate) 播放它,它以int16 播放文件
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2015-09-04
    • 2020-09-24
    • 1970-01-01
    • 2021-03-21
    • 2021-09-02
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多