当前位置: 首页 > 知识库问答 >
问题:

有没有一种快速的方法可以在音频文件中找到(不一定能识别)人类语音?

崔涵亮
2023-03-14

我想写一个程序,自动同步未同步的字幕。我想到的解决方案之一是通过某种算法找到人类的语言,并调整其细微之处。我发现的API(Google Speech API、Yandex SpeechKit)与服务器配合使用(这对我来说不是很方便),并且(可能)做了很多不必要的工作来确定到底说了什么,而我只需要知道说了什么。

换句话说,我想给它一个音频文件,然后得到如下内容:

[(00:12, 00:26), (01:45, 01:49) ... , (25:21, 26:11)]

是否有一种解决方案(最好是python)只查找人类语音并在本地机器上运行?

共有3个答案

通宾白
2023-03-14

您可以在音频文件中运行一个窗口,并尝试提取总信号功率中人类发声频率的哪一部分(基本频率在50到300 Hz之间)。以下是为了提供直觉,未经在真实音频上测试。

import scipy.fftpack as sf
import numpy as np
def hasHumanVoice(X, threshold, F_sample, Low_cutoff=50, High_cutoff= 300):
        """ Searching presence of frequencies on a real signal using FFT
        Inputs
        =======
        X: 1-D numpy array, the real time domain audio signal (single channel time series)
        Low_cutoff: float, frequency components below this frequency will not pass the filter (physical frequency in unit of Hz)
        High_cutoff: float, frequency components above this frequency will not pass the filter (physical frequency in unit of Hz)
        F_sample: float, the sampling frequency of the signal (physical frequency in unit of Hz)
        threshold: Has to be standardized once to say how much power must be there in real vocal signal frequencies.    
        """        

        M = X.size # let M be the length of the time series
        Spectrum = sf.rfft(X, n=M) 
        [Low_cutoff, High_cutoff, F_sample] = map(float, [Low_cutoff, High_cutoff, F_sample])

        #Convert cutoff frequencies into points on spectrum
        [Low_point, High_point] = map(lambda F: F/F_sample * M, [Low_cutoff, High_cutoff])

        totalPower = np.sum(Spectrum)
        fractionPowerInSignal = np.sum(Spectrum[Low_point : High_point])/totalPower # Calculating fraction of power in these frequencies

        if fractionPowerInSignal > threshold:
            return 1
        else:
            return 0

voiceVector = []
for window in fullAudio: # Run a window of appropriate length across the audio file
    voiceVector.append (hasHumanVoice( window, threshold, samplingRate)
贾飞章
2023-03-14

webrtcvad是围绕Google出色的WebRTC语音活动检测(VAD)实现的Python包装器,它在我使用的所有VAD中做得最好,能够正确地对人类语音进行分类,即使是在有噪音的音频中。

为了达到你的目的,你会做这样的事情:

  1. 将文件转换为8 KHz或16 Khz、16位、单声道格式。这是WebRTC代码所要求的。
  2. 创建一个VAD对象:vad=webrtcvad。Vad()
  3. 将音频分成30毫秒的块。
  4. 检查每个块是否包含语音:vad.is_speech(chunk,sample_rate)

VAD输出可能是“嘈杂的”,如果它将单个30毫秒的音频块归类为语音,您实际上不想为此输出时间。您可能希望查看过去0.3秒(或左右)的音频,看看该时间段内30毫秒的大部分是否被归类为语音。如果是,则输出该0.3秒时间段的开始时间作为语音的开始。然后您执行类似于检测语音何时结束的操作:等待0.3秒的音频周期,其中30毫秒的大部分块未被VAD归类为语音——发生这种情况时,将结束时间输出为语音结束。

您可能需要稍微调整一下时间,以获得良好的效果——可能您决定需要0.2秒的音频,其中超过30%的块在触发前被VAD分类为语音,以及1.0秒的音频,其中超过50%的块在解除触发前被分类为非语音。

环形缓冲区(Python中的collections.deque)是一种有用的数据结构,用于跟踪最后N个音频块及其分类。

姚信鸥
2023-03-14

您尝试执行的技术术语称为语音活动检测(VAD)。有一个名为SPEAR的python库可以做到这一点(除其他外)。

 类似资料:
  • 问题内容: 以下是一些HTML ASCII代码: http://www.ascii.cl/htmlcodes.htm 我有一个看起来像的字符串 用撇号替换该ascii代码的最佳方法是什么? 问题答案: 使用字符串解码。

  • 我正试图写一个程序,可以下载视频从Reddit帖子。我相信Reddit会分别存储每个帖子的音频和视频,所以我现在正在下载mp3和mp4,然后将它们结合起来制作最终的视频文件。我不太熟悉音频或视频文件或它们是如何存储的,但我认为将两者结合起来会很快计算出来。 然而,合并部分是非常缓慢的,我想知道是否有一个更快的方式,将无声的视频剪辑与音频文件结合,并将其写入我的驱动器? 我目前正在使用moviepy

  • 问题内容: 嗨,我想使用WMI类来查找应用程序和产品信息。但是问题是我想使用Java或任何脚本语言(如python,javascript或perl)。我听说过JWMI,这可能是一个选择。有人可以帮我吗??? 问题答案: JavaScript和Java不是一回事。 JavaScript Windows脚本宿主(WSH)下提供了JavaScript。有了它,访问WMI相当容易: jWMI(Java)

  • 问题内容: 我刚刚开始使用nodejs。我想知道是否有一种方法只能在应用程序中“一次”请求文件。我正在使用一个类框架来在我的JS项目中获取经典的OOPS。每个“类”都包含在其自己的JS文件中。我想“要求”每个文件中的类框架,以便它们可以独立运行,但希望框架的初始化代码仅执行一次。 我可以使用一个标志来自己实现,但是内置的方法会很好。搜索“ require一次”使我想到所有与PHP有关的问题。 问题

  • 所以我在Protege中构建了一个本体,它有注释和子注释。我的意思是,一个概念可能有一个定义,而这个定义可能有一个注释。 我正在尝试使用Flask应用程序(我正在使用Python解析本体文件)使本体易于查询,但我似乎无法快速获得所有的注释和子注释。 我开始使用包,但它要求您自定义每个单独的注释属性(您不能仅仅获得所有注释属性的列表,因此如果添加类似的属性,您必须返回代码并添加,否则将不会获得它)。

  • 问题内容: doIt函数将打印“ dad”。有没有办法让它打印“儿子”? 问题答案: 是。但是就变量而言,它会被覆盖(将新值赋予变量。将新定义赋予函数是Override)。 在父类的块中使用时,该值将得到反映 如果变量是静态的,则在初始化时使用静态块更改其值, 否则更改构造函数。 你还可以稍后在任何块中更改该值。它将反映在超一流