C: разделить файл WAV по паузу

У меня есть группа людей, читающих простое предложение (привет, мир) в виде файла wav. Как я могу разбить файл wav на 2 файла wav, каждый из которых содержит слово (привет и мир), автоматически распознав разрыв между словами? К сожалению, мне не удалось найти инструмент, чтобы сделать это за меня, поэтому я напишу код C, который сделает это. Что касается моего понимания, пробелы должны быть небольшими числовыми значениями в файле wav, это правильно? Я знаю, как разбивать файлы, Буду рад подойти к решению проблемы распознавания разрывов. Спасибо!


person JavaSheriff    schedule 20.10.2011    source источник


Ответы (3)


Я подхожу к этому типу задач, разбивая wav-файл на блоки, скажем, по 0,05 секунды каждый, вычисляя среднеквадратичную амплитуду каждого блока и сравнивая среднеквадратичное значение усилителя с пороговым значением. Если запись выполняется в тщательно контролируемых условиях и громкость речи относительно хорошо нормализована, порог может быть статическим значением, но другой способ сделать это - динамически, проверяя блок, который существенно громче предыдущего. Затем вы считаете блок сверх порога началом слова.

Однако в обычной речи паузы между словами может быть не так уж и много. Если я скажу вам "helloworld" без пауз, вы меня легко поймете.

Среднеквадратичная амплитуда определяется как квадратный корень из среднего за период времени квадратов отдельных образцов.

person Russell Borogove    schedule 20.10.2011
comment
Так будет ли пасудо-код таким? ‹Br› SAMPLE_SIZE = 0.05; for(int idxFile=0;idxFile<FILE_SIZE;idxFile++) { float fSum=0; for(int i=0;i<SAMPLE_SIZE;i++){ byte = read_next_byte(); fSum = fSum + SQUARE(byte); } RMS_amplitude = SQUARE(fSum / SAMPLE_SIZE ) if(RMS_amplitude < threshold){ print("Gap detected at byte:" + idxFile) } } - person JavaSheriff; 22.10.2011
comment
Нет новой строки в комментариях, невероятно ... ссылка - person JavaSheriff; 22.10.2011
comment
Образцы - это не секунды. Образцы - это не байты. В остальном это ОЧЕНЬ примерно идея. - person Russell Borogove; 22.10.2011
comment
Извините за мое незнание, как мне определить размер выборки? это информация в заголовке WAV? - person JavaSheriff; 24.10.2011
comment
да. Если вы еще не знакомы с работой по обработке аудиосигнала, возможно, вы не в своих силах. Чего вы хотите этим достичь на высоком уровне? - person Russell Borogove; 24.10.2011
comment
Спасибо за терпение. Это простая задача (разовая задача) - сломать файлы WAV для программного обеспечения, которое я пишу, я использую, чтобы сломать этот файл с помощью программного обеспечения (дерзость), пока мне это не надоест, поэтому я пытаюсь сломать файлы с использованием кода c (но это не так просто, как я ожидал ...) - person JavaSheriff; 24.10.2011

http://digitalcardboard.com/blog/2009/08/25/the-sox-of-silence/

Я уверен, что это та ссылка, которая вам нужна.

 sox in.wav out.wav silence 1 0.5 1% 1 5.0 1% : newfile : restart

SoX разделит звук при обнаружении 5 или более секунд тишины. В результате вы получите выходные файлы с именами out001.wav, out002.wav и т. Д.

person Yash    schedule 01.01.2014
comment
./sox in.wav out.wav молчание 1 0,1 0% 1 0,1 0%: newfile: restart - person Madhu S. Kapoor; 30.12.2014

См. этот ответ об обнаружении начала нот (определение начала и конца музыкальных нот в WAV-файл - это точно такая же проблема, как определение начала и конца произнесенного слова в WAV-файле).

Однако учтите, что поставленная вами задача по сути невозможна без чрезвычайно сложного (и еще не существующего) искусственного интеллекта. Когда человек говорит в записи, обычно нет промежутков между отдельными словами, которые численно отличались бы от промежутков между отдельными слогами в многосложных словах.

person MusiGenesis    schedule 20.10.2011