Meefik's Blog

Freedom and Open Source

Генерация и распознавание DTMF на JavaScript

Когда появляется задача передать некоторый код по аудио, то классическим решением являются DTMF коды. DTMF - это двухтональный многочастотный сигнал, используемый для набора телефонного номера. Однако реальное применение данной технологии гораздо шире.

Формат сигнала представляет собой сумму двух синусоидальных сигналов определенных частот. Символы DTMF кодируются следующими частотами:

  1209 Гц 1336 Гц 1477 Гц 1633 Гц
697 Гц 1 2 3 A
770 Гц 4 5 6 B
852 Гц 7 8 9 C
941 Гц * 0 # D

Есть множество примеров реализации DTMF, один из наиболее известных алгоритмов детекции DTMF является алгоритм Герцеля. Есть даже его реализация на JavaScript.

Распознавание кода происходит по частотной характеристики, а по временной характеристике можно реализовать фильтрацию от шумов.

JS-библиотека для работы с DTMF

Моя версия библитеки DTMF.js достаточно проста и использует Web Audio API как для генерации сигнала, так и для его распознавания в браузере. Аудио захватывается с микрофона функцией getUserMedia.

Пример получения и распознавания DTMF кодов:

var receiver = new DTMF.Receiver();
navigator.getUserMedia({ audio: true }, function(stream) {
  receiver.start(stream, function(code) {
    console.log(code);
  });
}, function(e) {
  console.error(e);
});

А вот пример генерации и воспроизведения DTMF кодов:

var sender = new DTMF.Sender();
sender.play('1234567890ABCD#*');

И небольшая демонстрация: