确定视频中说话的 'amount'
Determining the 'amount' of speaking in a video
我正在做一个转录讲座视频的项目。我们目前只是使用人工进行转录,因为我们认为转录比编辑 ASR 更容易,特别是对于技术主题(不是我的问题的重点,尽管我希望对此有任何意见)。根据我们的经验,我们发现在转录大约 10 分钟后,我们会变得焦虑或注意力不集中。因此,我们一直根据讲座内容中的逻辑中断将视频分成大约 5-7 分钟的块。但是,我们发现讲座开始时(至少对于我们正在试行的 class 来说)通常比后来的谈话要多,通常会有时间让学生们互相讨论一个问题。我在想我们可以进行信号处理以确定整个视频中的粗略说话量。这个想法是将视频分成包含大致相同数量的讲座的片段,而不是相同长度的片段。
我对此做了一些研究,但对于我正在尝试做的事情来说,一切似乎都有些矫枉过正。本课程的视频,虽然我们想概括一下,但基本上只包含讲师和一些偶尔的反馈和遥远的学生的声音。那么我是否可以简单地查看波形并粗略地使用包含超过某个阈值的音频的点来确定讲师何时讲话?或者是否真的需要 ML 方法来量化讲师的口语?
希望我说得有道理,如有必要,我可以澄清任何事情。
感谢您的帮助,因为我没有信号处理方面的经验。
尽管机器学习方法非常擅长将语音与其他声音区分开来,但您的应用程序似乎不需要那种准确性。一种类似于您提出的基于水平的简单方法应该足以让您估计发言时间。
基于级别的声音检测
目标
给定一个音频样本,从包含背景噪音的部分中区分出大量声音的部分。这可以很容易地用于估计声音文件中的语音量。
方法概述
我们将首先将其转换为滑动 window RMS,而不是查看信号中的原始电平。这给出了在音频样本的任何给定点有多少音频能量的简单测量。通过分析 RMS 信号,我们可以自动确定用于区分背景噪声和语音的阈值。
实例
我将在 MATLAB 中处理这个示例,因为它使数学运算变得容易,并且让我可以创建插图。
源音频
我正在使用肯尼迪总统的 "We choose to go to the moon" 演讲。我正在使用来自维基百科的音频文件,并且只是提取左声道。
imported = importdata('moon.ogg');
audio = imported.data(:,1);
plot(audio);
plot((1:length(audio))/imported.fs, audio);
title('Raw Audio Signal');
xlabel('Time (s)');
生成 RMS 信号
虽然您可以在技术上实现重叠的每个样本滑动 window,但避免重叠更简单,您会得到非常相似的结果。我将信号分成一秒钟的块,并将 RMS 值存储在一个新数组中,每秒输入一个音频。
audioRMS = [];
for i = 1:imported.fs:(length(audio)-imported.fs)
audioRMS = [audioRMS; rms(audio(i:(i+imported.fs)))];
end
plot(1:length(audioRMS), audioRMS);
title('Audio RMS Signal');
xlabel('Time (s)');
这会产生一个更小的数组,其中充满了代表音频能量或每秒 "loudness" 的正值。
选择阈值
下一步是确定 "loud" 是如何 "loud enough." 您可以通过直方图了解噪音水平的分布:
histogram(audioRMS, 50);
我怀疑下架是人群和录音环境的一般背景噪音。下一个架子可能是更安静的掌声。剩下的就是演讲和响亮的人群反应,这种方法无法区分。对于您的应用程序,最响亮的区域几乎总是语音。
我的 RMS 信号中的最小值为 .0233,作为粗略的猜测,我将使用该值的 3 倍作为我的噪声标准。这似乎会切断整个下层架子和下一个架子的大部分。
针对该阈值的简单检查给出了 972 秒的语音计数:
>> sum(audioRMS > 3*min(audioRMS))
ans =
972
为了测试它实际效果如何,我们可以试听被淘汰的音频。
for i = 1:length(speech)
if(~speech(i))
clippedAudio = [clippedAudio; audio(((i-1)*imported.fs+1):i*imported.fs)];
end
end
>> sound(clippedAudio, imported.fs);
由于分析中使用的是一秒 windows,因此听这个会产生超过一分钟的背景人群噪音和亚秒级的部分单词片段。没有明显的语音长度被剪掉。做相反的事情会产生主要是语音的音频,当部分被跳过时会听到咔哒声。更响亮的掌声也让它通过了。
这意味着对于此语音,最小 RMS 的三倍阈值效果很好。您可能需要 fiddle 该比率才能为您的录音环境获得良好的自动结果,但这似乎是一个不错的起点。
我正在做一个转录讲座视频的项目。我们目前只是使用人工进行转录,因为我们认为转录比编辑 ASR 更容易,特别是对于技术主题(不是我的问题的重点,尽管我希望对此有任何意见)。根据我们的经验,我们发现在转录大约 10 分钟后,我们会变得焦虑或注意力不集中。因此,我们一直根据讲座内容中的逻辑中断将视频分成大约 5-7 分钟的块。但是,我们发现讲座开始时(至少对于我们正在试行的 class 来说)通常比后来的谈话要多,通常会有时间让学生们互相讨论一个问题。我在想我们可以进行信号处理以确定整个视频中的粗略说话量。这个想法是将视频分成包含大致相同数量的讲座的片段,而不是相同长度的片段。
我对此做了一些研究,但对于我正在尝试做的事情来说,一切似乎都有些矫枉过正。本课程的视频,虽然我们想概括一下,但基本上只包含讲师和一些偶尔的反馈和遥远的学生的声音。那么我是否可以简单地查看波形并粗略地使用包含超过某个阈值的音频的点来确定讲师何时讲话?或者是否真的需要 ML 方法来量化讲师的口语?
希望我说得有道理,如有必要,我可以澄清任何事情。
感谢您的帮助,因为我没有信号处理方面的经验。
尽管机器学习方法非常擅长将语音与其他声音区分开来,但您的应用程序似乎不需要那种准确性。一种类似于您提出的基于水平的简单方法应该足以让您估计发言时间。
基于级别的声音检测
目标
给定一个音频样本,从包含背景噪音的部分中区分出大量声音的部分。这可以很容易地用于估计声音文件中的语音量。
方法概述
我们将首先将其转换为滑动 window RMS,而不是查看信号中的原始电平。这给出了在音频样本的任何给定点有多少音频能量的简单测量。通过分析 RMS 信号,我们可以自动确定用于区分背景噪声和语音的阈值。
实例
我将在 MATLAB 中处理这个示例,因为它使数学运算变得容易,并且让我可以创建插图。
源音频
我正在使用肯尼迪总统的 "We choose to go to the moon" 演讲。我正在使用来自维基百科的音频文件,并且只是提取左声道。
imported = importdata('moon.ogg');
audio = imported.data(:,1);
plot(audio);
plot((1:length(audio))/imported.fs, audio);
title('Raw Audio Signal');
xlabel('Time (s)');
生成 RMS 信号
虽然您可以在技术上实现重叠的每个样本滑动 window,但避免重叠更简单,您会得到非常相似的结果。我将信号分成一秒钟的块,并将 RMS 值存储在一个新数组中,每秒输入一个音频。
audioRMS = [];
for i = 1:imported.fs:(length(audio)-imported.fs)
audioRMS = [audioRMS; rms(audio(i:(i+imported.fs)))];
end
plot(1:length(audioRMS), audioRMS);
title('Audio RMS Signal');
xlabel('Time (s)');
这会产生一个更小的数组,其中充满了代表音频能量或每秒 "loudness" 的正值。
选择阈值
下一步是确定 "loud" 是如何 "loud enough." 您可以通过直方图了解噪音水平的分布:
histogram(audioRMS, 50);
我怀疑下架是人群和录音环境的一般背景噪音。下一个架子可能是更安静的掌声。剩下的就是演讲和响亮的人群反应,这种方法无法区分。对于您的应用程序,最响亮的区域几乎总是语音。
我的 RMS 信号中的最小值为 .0233,作为粗略的猜测,我将使用该值的 3 倍作为我的噪声标准。这似乎会切断整个下层架子和下一个架子的大部分。
针对该阈值的简单检查给出了 972 秒的语音计数:
>> sum(audioRMS > 3*min(audioRMS))
ans =
972
为了测试它实际效果如何,我们可以试听被淘汰的音频。
for i = 1:length(speech)
if(~speech(i))
clippedAudio = [clippedAudio; audio(((i-1)*imported.fs+1):i*imported.fs)];
end
end
>> sound(clippedAudio, imported.fs);
由于分析中使用的是一秒 windows,因此听这个会产生超过一分钟的背景人群噪音和亚秒级的部分单词片段。没有明显的语音长度被剪掉。做相反的事情会产生主要是语音的音频,当部分被跳过时会听到咔哒声。更响亮的掌声也让它通过了。
这意味着对于此语音,最小 RMS 的三倍阈值效果很好。您可能需要 fiddle 该比率才能为您的录音环境获得良好的自动结果,但这似乎是一个不错的起点。