Голосовой кодек codec2 и его установка на Mac

Меня тут заинтересовала задачка о передаче голоса по радио, да не просто так, а на bleeding edge современных технологий.

Как вы думаете, насколько сильно можно сжать аудиопоток с речью, не очень потеряв в качестве? 64 кбит/с, как в стандарте для телефонной связи? 32 кбит/с, реальный минимум для mp3? Окей, может быть 13 кбит/с, как в GSM?

Кодек codec2 даёт возможность сжать голос до умопомрачительных 1.2 кбит/с, причём вы можете даже практически не заметить разницы, особенно в шумном окружении. И это не всё, есть ещё и тариф для настоящих скупердяев с битрейтом 700 БИТ В СЕКУНДУ!

Этот кодек разработан тем же парнем, который в своё время участвовал в создании Speex (который так любит ST), из которого потом вырос Opus. Спору нет, оба эти кодека прекрасны, и давно пробрались в энтерпрайз и даже в американскую военку. Но теперь Дэвид Роуи захотел сделать ещё более мощный кодек, и самое главное — он (естественно) опенсорсный и полностью свободен от патентных ограничений.

К слову, о военке — у НАТО есть голосовой кодек MELPe для тактических применений, который достигает битрейта 600 бит/с, и на него давно текут слюнки у многих инженеров. Но нет, он конечно же полностью проприетарен, в открытом доступе есть только описание стандарта MELPe 2400 бит/с, который уже не так интересен. Получается, появление codec2 полностью закрывает эту проблему.

Давайте скачаем его и проверим. На сайте есть руководство по его сборке на *nix, но там есть одна небольшая ошибка, а ещё мне надо было собирать его под Mac, поэтому читайте тут.

Установка codec2 в OSX

Первым делом, нам потребуется сборщик cmake. Скачайте его dmg-образ (последняя версия на момент написания — 3.3.0rc3), установите и перетащите в папку Applications. Теперь надо ещё прописать его в PATH, чтобы можно было использовать его из командной строки — выполните в терминале команду

sudo "/Volumes/cmake-3.3.0-rc3-Darwin-x86_64/CMake.app/Contents/bin/cmake-gui" --install

Посмотреть её можно в меню запущенного gui cmake: Tools -> How to Install for Command Line Use.

Теперь скачиваем и собираем codec2.

svn co http://svn.code.sf.net/p/freetel/code/codec2 codec2
cd codec2
mkdir build_linux
cd build_linux
cmake ../
make
cd src

В примерах есть несколько файлов с записью голоса. Попробуем сжать один из файлов:

./c2enc 1200 ../../raw/hts1a.raw hts1a.c2

Размер сжатой записи составил 450 байт. Разожмём обратно:

./c2dec 1200 hts1a.c2 hts1a_c2.raw

Получился файл с сырыми аудиоданными в формате 16-битных знаковых целых и частотой дискретизации 8000 Гц. В OSX нет встроенных средств для прослушивания сырого аудио, и чтобы послушать его — можно импортировать файл в Audacity, а лучше установим аудиопроцессор sox:

brew install sox

И можно слушать результат:

cat hts1a_c2.raw | sox -traw -r8000 -b16 -e signed-integer - -tcoreaudio

По-моему, отлично. Битрейт сжатых данных составляет ровно 1200 бит/с, как и было заказано.

Но интереснее же попробовать на реальных примерах! Я записал пару секунд своего голоса, и прогнал их через кодек на максимальном сжатии. Получился битрейт около 1300 бит/с, но есть одна проблема. Похоже, кодек в тестовой программе не различает тишину (как такое вообще может быть?), и можно отчётливо слышать в самом начале, до начала голоса, какие-то помехи. Понятно, что место в файле они тоже занимают.

В следующей статье попробуем его более углублённо, напишем собственную программу — тест кодека.

Устройство кодека

Немного о том, как же добиваются таких нереальных степеней сжатия. Три основных метода:

  1. Речь занимает довольно узкую полосу частот, а значит можно обрезать весь спектр только до этого диапазона. В телефонии обычно используют полосу 300..3400Гц, и её хватает для сохранения чёткости и разборчивости голоса.
  2. Опять же, речь довольно хорошо описывается некоторыми упрощёнными формулами, например кодек codec2 использует аппроксимация голоса набором синусоид — гармоник некой базовой частоты голоса. Хватает очень ограниченного набора частот, чтобы представить речь достаточно точно.
  3. Полученные данные описываются методом кодирования с линейным предсказанием (LPC), который даёт возможность свести индивидуальные особенности голоса человека к небольшому набору коэффициентов, буквально описывающих его речевой аппарат.

Блок-схема внутренностей кодека:

enc_2550

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

Потоковое кодирование и передача

Codec2 — это потоковый кодек, который работает с отдельными наборами семплов звука по 40мс. Он даёт возможность сжимать речь он-лайн, передавать её (например, по радиоканалу) и тут же раскодировать её на приёмнике, значительно экономя пропускную способность канала, ценой лишь несущественной задержки.

Кстати, Дэвид сделал ещё и софт-модем, работающий с codec2. С модуляцией QPSK полоса пропускания такого канала связи составляет всего 1.3кГц.

Всё это даёт нам возможность создания цифровой рации на доступных и недорогих компонентах, которая тем не менее будет иметь хорошие параметры. Подробнее — в следующих статьях :)

Ссылка на основную публикацию