Как идентифицировать высказывание слова в звуковом сигнале - PullRequest
1 голос
/ 06 апреля 2020

У меня есть файл .WAV (little-endian, 16-битный, моно, 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()
...