Можно ли найти отрезки тишины в аудиофайлах с помощью Javascript? - PullRequest
3 голосов
/ 01 октября 2009

Я работал над инструментом для расшифровки записей речи с помощью Javascript. По сути, я подключаю ключевые события для воспроизведения, приостановки и зацикливания файла, считываемого с помощью тега audio.

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

Мне интересно, возможно ли эмулировать подмножество этих функций в браузере с помощью Javascript. Я не очень разбираюсь в обработке сигналов, возможно, это даже невозможно.

Но я предполагаю, что Javascript читает звуковой поток из файла и периодически дискретизирует амплитуду. Если амплитуда очень мала в течение определенного порога времени, это будет обозначено как разрыв фразы.

Такая маркировка, я думаю, была бы очень полезна для транскрипции. Затем я мог настроить ключевые команды, чтобы перейти к предыдущему периоду молчания. Итак, гипотетически (воображая API на основе jQuery):

var audio = $('audio#someid');

var silences = silenceFindingVoodoo(audio);

silences будет содержать список раз, так что я могу каким-то образом подключиться, чтобы позволить пользователю прыгать через различные silence с, а затем установить currentTime на выбранное значение и воспроизвести его. .

Возможно ли вообще делать подобные вещи с Javascript?

Ответы [ 5 ]

1 голос
/ 01 октября 2009

Я думаю, что возможно с использованием javascript (хотя, может быть, и не рекомендуется, конечно). Эта статья:

https://developer.mozilla.org/En/Using_XMLHttpRequest#Handling_binary_data

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

Обновление : после прочтения вашего вопроса я понял, что на самом деле можно сделать то, что вы обсуждаете в javascript, даже если файлы в формате MP3, а не в формате WAV. Как я понимаю ваш вопрос, вы на самом деле просто пытаетесь найти точки молчания в аудиопотоке, в отличие от фактического удаления тихих участков.

Чтобы найти тихие отрезки, вам необязательно преобразовывать данные в частотной области файла MP3 обратно во временную область файла WAV. Фактически, определение тихих участков звука может быть действительно более надежно выполнено в частотной области, чем во временной. Тихие участки, как правило, имеют отчетливо плоский график частотных характеристик, тогда как во временной области амплитуды пиков слышимой речи иногда не намного превышают пики фонового шума, особенно если происходит автоматическое выравнивание.

Анализ файла MP3 в javascript был бы значительно проще, если бы файл представлял собой CBR (постоянную скорость передачи данных) вместо VBR (переменную скорость передачи данных).

1 голос
/ 01 октября 2009

Если вы используете потоки WebWorker, вы можете сделать это в Javascript, но для этого потребуется использовать больше потоков в браузере. Вы можете разбить проблему на несколько потоков и обработать ее, но было бы практически невозможно синхронизировать это с воспроизведением. Таким образом, Javascript может определять периоды молчания, выполняя некоторую обработку звука, но, поскольку вы не можете правильно связать это с воспроизведением, это не будет лучшим выбором.

Но, если вы хотите показать формы сигналов пользователю, тогда для этого можно использовать javascript и canvas, но затем см. Следующий абзац для потоковой передачи.

Лучше всего, чтобы сервер передавал аудио, и он мог выполнять обработку и находить все молчания. Затем каждый из них должен быть сохранен в отдельном файле, чтобы вы могли легко переключаться между режимами молчания, и благодаря потоковой передаче ваше серверное приложение может определить, когда загружать новый файл, чтобы не было перерыва.

1 голос
/ 01 октября 2009

Я не думаю, что JavaScript - это инструмент, который вы хотите использовать для обработки этих аудиофайлов - это вызывает проблемы. Тем не менее, javascript может легко прочитать соответствующий XML-файл, который описывает, где эти молчания происходят в аудиофайле, соответствующим образом настраивая пользовательский интерфейс. Тогда возникает вопрос: что вы используете для генерации этих XML-файлов:

  1. Вы можете сделать это вручную, если вам нужно сразу же продемонстрировать эту возможность. (Используйте Audacity, чтобы увидеть, где эти аудио конверты)

  2. Ознакомьтесь с этой статьей CodeProject , которая создает библиотеку обработки wav в C #. Автор создал функцию для извлечения тишины из входного файла. Вероятно, это хорошее место для начала взлома.

Всего лишь две мои первоначальные мысли ... Существует множество API обработки звука, но они написаны для конкретных сред и языков программирования приложений. Обязательно используйте их, прежде чем пытаться написать что-то с нуля ... если только вы действительно не любите преобразования Фурье.

1 голос
/ 01 октября 2009

Насколько я знаю, JavaScript не достаточно мощный, чтобы сделать это.

Для этого вам придется прибегнуть к флеш-памяти или какой-то другой обработке на стороне сервера.

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

0 голосов
/ 10 января 2019

Да, это возможно с Web Audio API , если быть более точным, вам понадобится AnalyserNode . Чтобы дать вам краткое подтверждение концепции, вы можете получить этот пример и добавить следующий код к drawTimeDomain():

var threshold = 1000;
var sum = 0;
for (var i in amplitudeArray) {
    sum += Math.abs(128 - amplitudeArray[i]);
}
var test = (sum < threshold) ? 'silent' : 'sound';
console.log('silent info', test);

Вам просто потребуется дополнительная логика для фильтрации молчания по миллисекундам (например, любое молчание, занимающее более 500 мс, должно рассматриваться как настоящее молчание)

...