首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python从音频中获取时间戳

使用python从音频中获取时间戳
EN

Stack Overflow用户
提问于 2019-11-29 09:33:08
回答 2查看 5.5K关注 0票数 3

我有很多音频文件,我想在发言开始和结束时自动添加时间戳。因此,一个“开始”的时间戳时,一个话语开始。以及在话语结束时的“停止”时间戳。

比如:

代码语言:javascript
复制
start,stop
0:00:02.40,0:00:11.18
0:00:18.68,0:00:19.77
...

我测试了下面的解决方案,它运行得很好:使用静默检测分割音频文件问题是,我只能从这个问题中获得块,这使得将时间戳与原始音频匹配起来有点困难

任何解决方案或推动在正确的方向将是高度赞赏的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-03 07:45:21

理想情况下,应用具有全面测试/训练数据的ML算法将产生一个动态解决方案,可能不需要对静音长度和阈值值进行任何手动调整。

然而,可以使用pydub的非沉默方法设计一个简单的静态解决方案。此方法以连续的方式返回非无声块的开始和停止时间。

以下参数会影响可能需要进行一些调整的结果。

min_silence_len :以毫秒为单位的最小静音长度,即音频中所期望的长度。

silence_thresh :在这三种情况下的任何东西都被认为是沉默。

在尝试时,我确实注意到,在通过detect_nonsilent方法运行之前,对音频进行规范化非常有帮助,这可能是因为增益被应用于达到平均振幅水平,这使得检测沉默变得更加容易。

示例音频文件是从公开语音回复下载的。每个音频文件有10个口语句子,两者之间有一定的差距。

下面是一个实用的演示代码:

代码语言:javascript
复制
from pydub import AudioSegment
from pydub.silence import detect_nonsilent

#adjust target amplitude
def match_target_amplitude(sound, target_dBFS):
    change_in_dBFS = target_dBFS - sound.dBFS
    return sound.apply_gain(change_in_dBFS)

#Convert wav to audio_segment
audio_segment = AudioSegment.from_wav("OSR_us_000_0010_8k.wav")

#normalize audio_segment to -20dBFS 
normalized_sound = match_target_amplitude(audio_segment, -20.0)
print("length of audio_segment={} seconds".format(len(normalized_sound)/1000))

#Print detected non-silent chunks, which in our case would be spoken words.
nonsilent_data = detect_nonsilent(normalized_sound, min_silence_len=500, silence_thresh=-20, seek_step=1)

#convert ms to seconds
print("start,Stop")
for chunks in nonsilent_data:
    print( [chunk/1000 for chunk in chunks])

结果:

代码语言:javascript
复制
root# python nonSilence.py 
length of audio_segment=33.623 seconds
start,Stop
[0.81, 2.429]
[4.456, 5.137]
[8.084, 8.668]
[11.035, 12.334]
[14.387, 15.601]
[17.594, 18.133]
[20.733, 21.289]
[24.007, 24.066]
[27.372, 27.977]
[30.361, 30.996]

从大胆中可以看出(下面显示的差异),我们的结果在0.1秒-0.4秒的偏移内接近.调优detect_nonsilent参数可能有帮助。

代码语言:javascript
复制
Count From Script   From Audacity
1   0.81-2.429      0.573-2.833
2   4.456-5.137     4.283-6.421
3   8.084-8.668     7.824-9.679
4   11.035-12.334   10.994-12.833
5   14.387-15.601   14.367-16.120
6   17.594-18.133   17.3-19.021
7   20.773-21.289   20.471-22.258
8   24.007-24.066   23.843-25.664
9   27.372-27.977   27.081-28.598
10  30.361, 30.996  30.015-32.240

票数 4
EN

Stack Overflow用户

发布于 2019-12-02 19:04:27

您可以执行与你上面发布的pydub溶液类似的操作,但可以使用detect_silence函数(来自pydub.silence导入detect_silence),该函数将为您提供“静默范围”,即每个静默期的开始和停止。这种消极的形象--开始是停止,停止是开始--是非沉默的时期。有人展示了一个使用detect_silence 这里的示例。

编辑:

下面是链接中的示例代码(以防链接下降):

代码语言:javascript
复制
def test_realistic_audio(self):
    silent_ranges = detect_silence(self.seg4, min_silence_len=1000, silence_thresh=self.seg4.dBFS)

    prev_end = -1
    for start, end in silent_ranges:
        self.assertTrue(start > prev_end)
        prev_end = end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59102171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档