【问题标题】:How do I compute the duration of an audio clip from a byte array?如何从字节数组计算音频剪辑的持续时间?
【发布时间】:2019-04-12 13:32:54
【问题描述】:

我正在使用 Google 云 API 合成语音。我有以下有关语音合成响应的信息。

  • 采样率:8000 Hz
  • 音频格式:MP3
  • 字节数组的长度

API 的响应是一个字节数组。鉴于这些信息,我如何近似或准确计算合成音频的长度?

【问题讨论】:

  • 我不是这个领域的专家,但如果采样率为 8000 Hz,我相信这意味着每秒采集了 8000 个音频样本。因此,您应该能够将字节数组的长度除以 8000 来计算音频剪辑的长度以秒为单位
  • @JacobG。这对于 MP3 来说是不正确的。

标签: java audio mp3 audio-streaming sample-rate


【解决方案1】:

您没有足够的信息来计算音频的持续时间。

MP3 是一种有损编解码器,可以以多种不同的比特率运行。事实上,比特率可以在整个文件中发生变化。更糟糕的是,MP3 在其通常格式中没有任何固有的时间戳。准确知道其长度的唯一真正方法是对其进行解码。

或者,如果您知道比特率,您可以将文件除以比特率并获得近似长度。如果您可以假设整个文件中的比特率是恒定的,则可以通过读取第一帧的标题来获得比特率。另见:http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm

【讨论】:

  • 我已经将解码的 MP3 音频作为字节字符串。我该如何从那里计算长度?我在 gRPC 中使用 Google Cloud API。这已经根据文档以解码格式返回我的音频剪辑。 cloud.google.com/text-to-speech/docs/base64-decoding 谢谢。
  • @Vino 是 MP3 还是不是?您在问题中说它在 MP3 中,必须对其进行解码(至少通过帧头检查)才能获得持续时间。您刚刚链接到的是 base64,它与 MP3 无关...... base64 只是一种将二进制数据推入文本上下文的方法。您需要在下一步中解码 MP3。
  • 不,我的意思是我的数据已经是二进制形式,因为我使用 gRPC 来获取合成音频。我正在使用这个 API,在AudiConfig 中我可以将格式设置为 MP3。我得到的输出是一个字节数组。所以根据 MP3 规范,如果我读取前 4 个字节,它将具有 MP3 标头的信息,其中可能包含我需要的信息
  • @Vino 太好了,现在将 MP3 格式的字节流解码为 PCM。或者至少同步到帧头(11111111111的11位),统计帧数,乘以1152样本,再除以采样率。不,正如我在回答中所说,MP3 标题 没有 没有你需要的东西。没有包含文件完整持续时间的标题。它只是 MPEG 帧。这就是为什么你必须解析整个文件。
  • 感谢您的回复。据我了解,您希望我搜索有 11 个后续 1 位的数组。这是我的标题。从这里我如何计算帧数。在 MP3 规范中,他们建议我使用这个等式144 * BitRate / SampleRate + Padding,但我不知道其中的比特率。请告知如何进行计算帧数部分。非常感谢。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 2016-06-08
  • 1970-01-01
相关资源
最近更新 更多