Я использую Asterisk для взаимодействия с устройствами аналоговой телефонии, которые можно программировать и тестировать с помощью DTMF-взаимодействия.
Некоторые из этих ребят говорят довольно быстро. Слишком быстро можно было убедительно возразить; Я был бы там с тобой. И все же Asterisk прекрасно слышит тоны, и если мне посчастливится получить чистый поток с внутриполосным DTMF-звуком, я могу очень успешно распознать даже очень быстрые тона.
Проблема возникает, когда Asterisk (или другая телефонная система) решает, что ей необходимо распознать и восстановить DTMF. Я понимаю, что это важно при переводе, например. в / из внеполосного DTMF, но я не уверен, почему это действие по умолчанию для этого, и, в частности, почему он часто регенерируется с большой продолжительностью (например, 100 мс; к счастью, в Asterisk это может быть измененным, хотя может потребоваться перекомпиляция), что почти гарантированно приведет к потере цифр. Другие сообщали о проблемах, когда внутриполосное преобразование во внеполосное приводило к дублированию цифр, даже если преобразование не было необходимым.
Итак, мой вопрос: почему это M.O. для систем телефонии? Почему бы не оставить в покое DTMF во время вызова, если явно не требуется перевод?
Сделайте высококачественную запись на компакт-диске вашей любимой песни.
Запишите это, используя самый дешевый микрофон, который вы можете найти.
Кодируйте запись паршивым 8-битным аудиокодеком, оптимизированным для произнесения слов.
Воспроизведите запись через дешевый динамик (и пошевелите проводами).
Если вы послушаете компакт-диск и приведенную выше цепочку рядом, вы услышите, как сильно искажается телефонная связь. Теперь представьте, что вместо песни вы записали тоны DTMF и пытались воспроизвести их и заставить компьютер их распознать.
Вот почему большинство систем VoIP перекодируют тоны DTMF с использованием внеполосного канала (например, RFC 2833) - сжатие, дрожание сети, задержка и потенциальная потеря пакетов делают кодированный аудиосигналом DTMF склонным к сбоям.
Отправляя тоны DTMF как внеполосные данные, они могут быть повторно вставлены в аудиопоток в конечной точке, ближайшей к PSTN, сводя к минимуму риск искажения тонов.
Почему 100 мс? Поскольку у некоторых телефонных линий или удаленных концов есть проблемы с более короткой продолжительностью тонального сигнала (если вы когда-либо вызывали систему тонального набора через шумную наземную линию, вы, вероятно, удерживали кнопку в течение нескольких секунд, чтобы заставить систему распознать тон).
(100 мс, вероятно, слишком долго - 20-50 мс более чем достаточно)
Ты не иметь использовать внеполосную сигнализацию - влажные системы VoIP будут иметь дело с внутриполосной сигнализацией (обычно вам нужно установить параметр на вашем телефоне и ваш сервер сделать так, а ты должен используйте высококачественные кодеки (или полностью отключите сжатие, если хотите по-настоящему повысить надежность).
Большинство людей, развертывающих их, предпочитают использовать RFC 2833 (и перекодировать DTMF, полученный внутри полосы), потому что это значительно более надежно.