使用 python 从音频中获取时间戳
Getting timestamps from audio using python
我有很多音频文件,我想在语音开始和结束时自动添加时间戳。因此,话语开始时的 "start" 时间戳。以及话语结束时的 "stop" 时间戳。
喜欢:
start,stop
0:00:02.40,0:00:11.18
0:00:18.68,0:00:19.77
...
我测试了以下解决方案并且工作正常:问题是我只能从中获取块,这使得将时间戳与原始音频进行匹配有些困难
任何正确方向的解决方案或推动将不胜感激!
您可以执行与 did but instead use the detect_silence function (from pydub.silence import detect_silence) that will give you "silent ranges" which are the start and stop of each silent period. The negative image of that - the starts as stops and the stops as starts - are the periods of non-silence. Someone shows an example of using detect_silence here
类似的操作
编辑:
这是来自 link 的示例代码(以防万一 link 会下降):
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
理想情况下,应用具有综合 test/train 数据的 ML 算法将产生一个动态解决方案,可能不需要对静默长度和阈值进行任何手动调整。
但是,可以使用 pydub 的 detect_nonsilent 方法设计一个简单的静态解决方案。此方法 returns 以连续方式为非静默块启动和停止时间。
以下参数影响可能需要一些调整的结果。
min_silence_len :您在音频中期望的最小静音长度(以毫秒为单位)。
silence_thresh : 任何低于这个阈值的东西都被认为是沉默。
在尝试时,我确实注意到在 运行 之前通过 detect_nonsilent 方法对音频进行标准化有很大帮助,可能是因为应用增益来实现平均振幅水平,这使得检测静音更容易。
示例音频文件是从 open speech repo 下载的。每个音频文件有 10 个口语句子,中间有一些间隔。
这是一个有效的演示代码:
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])
结果:
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]
如在 audacity 中所见(差异如下所示),我们的结果接近 0.1 - 0.4 秒偏移。调整 detect_nonsilent 个参数可能会有帮助。
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
我有很多音频文件,我想在语音开始和结束时自动添加时间戳。因此,话语开始时的 "start" 时间戳。以及话语结束时的 "stop" 时间戳。
喜欢:
start,stop
0:00:02.40,0:00:11.18
0:00:18.68,0:00:19.77
...
我测试了以下解决方案并且工作正常:
任何正确方向的解决方案或推动将不胜感激!
您可以执行与
编辑:
这是来自 link 的示例代码(以防万一 link 会下降):
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
理想情况下,应用具有综合 test/train 数据的 ML 算法将产生一个动态解决方案,可能不需要对静默长度和阈值进行任何手动调整。
但是,可以使用 pydub 的 detect_nonsilent 方法设计一个简单的静态解决方案。此方法 returns 以连续方式为非静默块启动和停止时间。
以下参数影响可能需要一些调整的结果。
min_silence_len :您在音频中期望的最小静音长度(以毫秒为单位)。
silence_thresh : 任何低于这个阈值的东西都被认为是沉默。
在尝试时,我确实注意到在 运行 之前通过 detect_nonsilent 方法对音频进行标准化有很大帮助,可能是因为应用增益来实现平均振幅水平,这使得检测静音更容易。
示例音频文件是从 open speech repo 下载的。每个音频文件有 10 个口语句子,中间有一些间隔。
这是一个有效的演示代码:
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])
结果:
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]
如在 audacity 中所见(差异如下所示),我们的结果接近 0.1 - 0.4 秒偏移。调整 detect_nonsilent 个参数可能会有帮助。
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