Анализ звука без getUserMedia

Я пытаюсь проанализировать аудиовыход из браузера, но не хочу, чтобы появлялось приглашение getUserMedia (которое запрашивает разрешение на использование микрофона). Источниками звука являются SpeechSynthesis и файл Mp3. Вот мой код:

return navigator.mediaDevices.getUserMedia({
        audio: true
      })
      .then(stream => new Promise(resolve => {
        const track = stream.getAudioTracks()[0];
        this.mediaStream_.addTrack(track);
        this._source = this.audioContext.createMediaStreamSource(this.mediaStream_);
        this._source.connect(this.analyser);
        this.draw(this);

      }));

Этот код работает нормально, но запрашивает разрешение на использование микрофона! Я вообще не заинтересован в микрофоне, мне нужно только измерить аудиовыход. Если я проверю все доступные устройства:

navigator.mediaDevices.enumerateDevices()
.then(function(devices) {
  devices.forEach(function(device) {
    console.log(device.kind + ": " + device.label +
            " id = " + device.deviceId);
  });
})

Я получаю список доступных устройств в браузере, включая «аудиовыход». Итак, есть ли способ направить аудиовыход в медиапоток, который затем можно использовать внутри функции createMediaStreamSource? Я проверил всю документацию по аудио API, но не смог ее найти. Спасибо всем, кто может помочь!


person GiulioG    schedule 19.02.2018    source источник
comment
Откуда этот звук? Из того, что дают нам разные API, как только он достиг вывода, уже слишком поздно его ловить, нужно сделать это раньше, и это иногда можно сделать, но действительно по-разному в зависимости от источника.   -  person Kaiido    schedule 19.02.2018
comment
Звук поступает из 2-х источников: SpeechSynthesis и Mp3 файл.   -  person GiulioG    schedule 19.02.2018
comment
Было бы неплохо включить его в качестве редактирования.   -  person Kaiido    schedule 19.02.2018


Ответы (1)


Есть разные способы получить MediaStream, исходящий из gUM, но вы не сможете поймать все возможные аудиовыходы...

Но для вашего mp3-файла, если вы читаете его через MediaElement (<audio> или <video>), и если этот файл обслуживается без нарушения CORS, вы можете использовать MediaElement.captureStream. Если вы читаете его из WebAudioAPI или если вы ориентируетесь на браузеры, которые не поддерживают captureStream, вы можете использовать AudioContext.createMediaStreamDestination.

Для SpeechSynthesis, к сожалению, вам понадобится gUM... и виртуальное аудиоустройство: сначала вам нужно установить вывод по умолчанию на VAB_out, затем направить VAB_out на VAB_in и, наконец, получить VAB_in из gUM...

Это непростая и универсально выполнимая задача, тем более, что IIRC SpeechSynthesis не имеет setSinkId.

person Kaiido    schedule 19.02.2018
comment
Спасибо за ваш ответ. Я действительно надеялся, что будет способ обойти gUM для анализа вывода звука для синтеза речи. Нет смысла спрашивать разрешение микрофона, когда все, что вам нужно, это вывод звука! - person GiulioG; 19.02.2018
comment
Не говорите мне об этом... Но это текущее положение вещей, и это даже боль для разработчиков, которые не могут делать автоматические тесты без VAD... SS идет непосредственно к выходам ОС, у вас нет прямой доступ к нему. - person Kaiido; 19.02.2018
comment
Вы не знаете, есть ли планы изменить это положение вещей в будущем? Я приступаю к долгосрочному проекту, связанному с веб-аудио, и я не хочу писать код, который слишком быстро устаревает. - person GiulioG; 19.02.2018