【问题标题】:detecting pauses in a spoken word audio file using pymad, pcm, vad, etc使用 pymad、pcm、vad 等检测口语音频文件中的停顿
【发布时间】:2010-06-25 04:02:17
【问题描述】:

首先,我将大致说明我正在尝试做的事情并寻求建议。然后我将解释我目前的方法并询问我当前问题的答案。


问题

我有一个人说话的 MP3 文件。我想把它分成大致对应于一个句子或短语的片段。 (我会手动完成,但我们正在讨论数小时的数据。)

如果您对如何以编程方式或针对某些现有实用程序执行此操作有任何建议,我很想听听。 (我知道语音活动检测,并对其进行了一些研究,但我没有看到任何免费提供的实用程序。)


目前的方法

我认为最简单的方法是每隔一定时间扫描 MP3 并找出平均音量低于某个阈值的位置。然后我会使用一些现有的实用程序来切割这些位置的 mp3。

我一直在玩 pymad,我相信我已经成功地为 mp3 的每一帧提取了 PCM(脉冲编码调制)数据。现在我被困住了,因为我似乎无法真正理解 PCM 数据如何转换为相对音量。我也知道其他复杂的因素,如多通道、大端与小端等。

关于如何将一组 pcm 样本映射到相对体积的建议将是关键。

谢谢!

【问题讨论】:

  • 我也有类似的情况。您的问题找到解决方案了吗?

标签: mp3 pcm


【解决方案1】:

PCM 是基于时间框架的声音编码。对于每个时间范围,您都会获得一个峰值。 (如果您想要一个物理参考:峰值电平对应于麦克风膜在给定时间移出其静止位置的距离。) 让我们忘记 PCM 可以对 8 位样本使用无符号值,而专注于 有符号的值。如果该值 > 0,则膜位于其静止位置的一侧,如果该值

大多数语音分类方法都从一个非常简单的步骤开始:它们将峰值水平与阈值水平进行比较。如果峰值电平低于阈值,则声音被视为背景噪声。 查看 Audacity 的 Silence Finder 中的参数,silence level 应该是那个阈值。下一个参数Minimum silence duration 显然是标记中断(或者在您的情况下是句子的结尾)所需的静默期的长度。

如果您想自己编写类似的工具,我推荐以下方法:

  1. 将您的声音样本分成具有特定持续时间的离散集合。我会从 1/10、1/20 或 1/100 秒开始。
  2. 对于这些集合中的每一个,计算最大峰值电平
  3. 将此最大峰值与阈值(Audacity 中的silence level)进行比较。阈值是您必须根据声音样本的具体情况(响度、背景噪音等)自行确定的。如果最大峰值低于您的阈值,则此设置为静音。
  4. 现在分析一系列分类集:计算录音中的静音长度。 (长度 = 无声集的数量 * 集的长度)。如果它在您的Minimum silence duration 上方,则假设您在此处有句尾。

自己编写代码而不是继续使用 Audacity 的要点是,您可以通过使用高级分析方法来改进分类。您可以应用的一个非常简单的指标称为过零率,它只计算在给定的一组峰值水平中符号切换的频率(即您的值越过 0 线)。还有更多,所有这些都更复杂,但可能值得付出努力。例如,看看discrete cosine transformations...

【讨论】:

    【解决方案2】:

    只是想更新一下。我使用 Audacity 的 Silence Finder 取得了一定的成功。但是,我仍然对这个问题感兴趣。谢谢。

    【讨论】:

      【解决方案3】:

      PCM 是一种对正弦波进行编码的方法。它将被编码为一系列位,其中一个位(我猜是 1)表示函数增加,0 表示减少。该函数可以通过交替 1 和 0 保持大致恒定。

      要估计幅度,绘制正弦波,然后在 x 轴上对其进行归一化。然后,您应该能够估计正弦波在不同点的幅度。完成此操作后,您应该能够挑选出振幅较低的点。

      您也可以尝试使用傅里叶变换来估计信号最明显的位置。

      【讨论】:

      • 您对 PCM 编码的解释不正确,它只是给出了一个时间范围内的幅度。根本不使用正弦编码。
      猜你喜欢
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 2019-09-24
      • 2021-06-09
      • 1970-01-01
      相关资源
      最近更新 更多