У меня есть файл .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()