Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在声音信号中识别单词的发音_Python_Python 3.x_Signal Processing - Fatal编程技术网

Python 如何在声音信号中识别单词的发音

Python 如何在声音信号中识别单词的发音,python,python-3.x,signal-processing,Python,Python 3.x,Signal Processing,我有一个.WAV文件(little endian,16位,mono,16000hz PCM格式),其中包含一个单词的发音,每个单词之间大约有2秒的静音。每句话的长度约为每秒的3/4(平均)。我想要一种方法,将每一句话分离成一个单独的文件。各个文件的格式应该相同,从1-2秒的静默开始,然后是发言,然后在发言结束后立即结束。我这样做的方式是为信号强度设置一个手动阈值,每当信号强度超过阈值时,我就剪下一个两秒的窗口。然而,如果说话的长度不同,或者存在错误激活,则手动阈值方法是无用的 有没有一种方法可以

我有一个.WAV文件(little endian,16位,mono,16000hz PCM格式),其中包含一个单词的发音,每个单词之间大约有2秒的静音。每句话的长度约为每秒的3/4(平均)。我想要一种方法,将每一句话分离成一个单独的文件。各个文件的格式应该相同,从1-2秒的静默开始,然后是发言,然后在发言结束后立即结束。我这样做的方式是为信号强度设置一个手动阈值,每当信号强度超过阈值时,我就剪下一个两秒的窗口。然而,如果说话的长度不同,或者存在错误激活,则手动阈值方法是无用的

有没有一种方法可以在不指定手动阈值或固定窗口大小的情况下动态检测单词的开头?如何大致检测单词的开始和结束时间?我编写了以下代码

from scipy.io import wavfile
import numpy as np

def main():
    '''
    Driver Function
    '''
    sample_rate, data = wavfile.read('filename.wav')
    threshold = 2000
    file_count = 0

    i = 0
    while(i < data.shape[0]):
        if(abs(data[i]) > threshold):
            i = record(i, data, file_count, sample_rate)
            file_count += 1

        else:
            i += 1


def record(index, data, file_count, sample_rate):
    '''
    Records approximately 2 seconds of .wav file by cutting at the given index
    Returns the index where recording ended
    '''

    start_index = index - sample_rate # start 1 second before word detected
    end_index = index + sample_rate # end 1 second after it is detected

    file_name = "newfile--" + str(file_count) + ".wav"
    wavfile.write(file_name, sample_rate, data[start_index:end_index])

    return end_index

if __name__ == "__main__":
    main()
从scipy.io导入wavfile
将numpy作为np导入
def main():
'''
驱动函数
'''
采样率,数据=wavfile.read('filename.wav')
阈值=2000
文件计数=0
i=0
而(i阈值:
i=记录(i、数据、文件计数、采样率)
文件计数+=1
其他:
i+=1
def记录(索引、数据、文件计数、采样率):
'''
通过在给定索引处剪切,记录大约2秒的.wav文件
返回录制结束的索引
'''
开始索引=索引-采样率#在检测到单词前1秒开始
end#U index=索引+采样率#检测到后1秒结束
file_name=“newfile--”+str(文件计数)+“.wav”
write(文件名、采样率、数据[开始索引:结束索引])
返回端索引
如果名称=“\uuuuu main\uuuuuuuu”:
main()

您可能要寻找的基本算法类是呼叫“语音活动检测”方法。很多都取决于你的计算量和错误率要求。等等。谢谢@hotpaw2。你能给我推荐一个5分钟长的音频剪辑的最佳方法吗?大约有75句话?我希望错误率尽可能低。您可能正在寻找的基本算法类是“语音活动检测”方法。很多都取决于你的计算量和错误率要求。等等。谢谢@hotpaw2。你能给我推荐一个5分钟长的音频剪辑的最佳方法吗?大约有75句话?我希望错误率尽可能低。