我正在研究一个录制演讲视频的项目。我们目前仅使用人类来进行转录,因为我们认为转录比编辑ASR更容易,尤其是对于技术主题而言(不是我的意思,尽管我很喜欢这样做)。根据我们的经验,我们发现在转录大约10分钟后,我们会感到焦虑或失去注意力。因此,根据演讲内容的逻辑中断,我们已将视频分为约5-7分钟。但是,我们发现,授课开始(至少对于我们正在上课的类(class))的谈话要多于以后的讨论,而在以后的类(class)中,学生经常在彼此之间谈论一个问题。我当时在想,我们可以进行信号处理来确定整个视频中的粗略讲话量。想法是将视频分成包含大致相同数量演讲的片段,而不是相同长度的片段。
我对此进行了一些研究,但是对于我想做的一切似乎有些过头了。尽管我们想对此进行概括,但该类(class)的视频基本上只包含讲师,偶尔会有一些反馈和遥远的学生声音。因此,我可以仅查看波形并大致使用包含某个阈值以上音频的点来确定讲师何时讲话吗?还是真的需要机器学习方法来量化讲师的讲话?
希望有道理,如有必要,我可以澄清。
感谢我的经验,因为我没有信号处理方面的经验。
最佳答案
尽管有一些机器学习方法可以很好地将声音与其他声音区分开,但是您的应用程序似乎并不需要这种准确性。一种简单的基于级别的方法,类似于您提出的方法,应该足以让您估计讲话时间。
基于级别的声音检测
目标
给定音频样本,请从包含背景噪声的部分中区分出声音量较大的部分。然后可以轻松地将其用于估计声音文件中的语音量。
方法概述
我们将首先将其转换为滑动窗口RMS,而不是查看信号中的原始电平。这提供了在音频样本的任何给定点上多少音频能量的简单度量。通过分析RMS信号,我们可以自动确定用于区分背景噪声和语音的阈值。
工作实例
我将在MATLAB中使用此示例,因为它使数学易于实现,并让我创建了插图。
来源音频
我正在使用肯尼迪总统的“我们选择去月球”的讲话。我正在使用来自Wikipedia的音频文件,并且仅提取了左声道。
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信号
尽管您可以从技术上实现每个样本的滑动窗口的重叠,但避免重叠更简单,并且您将获得非常相似的结果。我将信号分成一秒钟的块,然后将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)');
这将导致阵列变小,充满正值,代表每秒的音频能量或“响度”。
选择阈值
下一步是确定“响度”如何“足够响亮”。您可以通过直方图了解噪声水平的分布:
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);
由于分析中使用的是一秒钟的窗口,因此听一分钟会产生一小部分的背景人群噪音和亚秒级的单词片段。没有明显的语音长度被剪切。进行相反操作时,音频大部分是语音,跳过部分时会听到喀哒声。响亮的掌声也使它成功。
这意味着对于此语音,三倍于最小RMS的阈值效果很好。您可能需要调整该比例才能在录制环境中获得良好的自动结果,但这似乎是一个不错的起点。
关于audio - 确定视频中讲话的 'amount',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29224038/