3

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


问题

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

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


当前方法

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

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

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

谢谢!

4

3 回答 3

3

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

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

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

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

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

于 2010-06-24T20:02:17.140 回答
0

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

于 2010-04-13T03:39:24.530 回答
-1

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

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

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

于 2010-04-13T00:57:31.083 回答