Голосовая почта и качественный скачок услуги благодаря Google (FreeSWITCH edition)

При использовании современных телефонных платформ услуга голосовой почты стала настолько привычной и востребованной, что разработчики «софтовых» АТС создают модули голосовой почты, производители «железных» АТС создают целые платы голосовой почты, а операторы связи предлагают ее как услугу. Все, как говорится, просто и понятно. Не дозвонился до абонента, система тебя переадресует на голосовую почту и предлагает оставить сообщение. Далее есть несколько вариантов — абоненту высылается оповещение (чаще это письмо) о том что оставлено голосовое сообщение, мол — зайди в систему и послушай. В более продвинутом варианте на почту сразу приходит файл с записью, что позволяет не теряя времени на посещение интерфейса системы — сразу из письма прослушать файл. Но можно сделать услугу еще удобнее и качественнее.

FreeSWITH+Google=Voicemail 2.0


Повысить качество услуги, на мой взгляд, можно присылая голосовую почту ТЕКСТОМ, aka speech-to-text. Немного предыстории. На форуме FreeSWITCH были выложены скрипты для Asterisk использующие Google speech api для распознавания речи с просьбой их модифицировать под FreeSWITCH. Я взял за основу скрипт, написанный на bash. Авторства, к сожалению, не знаю, поэтому сначала приведу скрипт без изменения:

#!/bin/sh
echo "1 SoX Sound Exchange - Convert WAV to FLAC with 16000"
sox $1 message.flac pad .1 0 rate 16k
echo "2 Submit to Google Voice Recognition"
wget -q -U "Mozilla/5.0" --post-file message.flac --header="Content-Type: audio/x-flac; rate=16000" -O - "http://www.google.com/speech-api/v1/recognize?lang=en-us&client=chromium" > message.ret
echo "3 SED Extract recognized text"
cat message.ret | sed 's/.*utterance":"//' | sed 's/","confidence.*//' > message.txt
echo "4 Remove Temporary Files"
rm message.flac
# rm message.ret
echo "5 Show Text "
cat message.txt


Этот скрипт я немного переделал под свои нужды, положил в папку /usr/local/freeswitch/scripts/ и в итоге он выглядит так:

#!/bin/sh
cd /usr/local/freeswitch/scripts/
sox tmp.wav message.flac pad .1 0 rate 16k > /dev/null 2>&1
wget -q -U "Mozilla/5.0" --post-file message.flac --header="Content-Type: audio/x-flac; rate=16000" -O - "http://www.google.com/speech-api/v1/recognize?lang=ru-RU&client=chromium" > message.ret
cat message.ret | sed 's/.*utterance":"//' | sed 's/","confidence.*//' >> messages.log
cat message.ret | sed 's/.*utterance":"//' | sed 's/","confidence.*//' | iconv -f UTF8 -t KOI8-U | mutt -x -s "new voice mail" -- moya_pochta@domen.ru
rm message.flac
rm tmp.wav
rm message.ret


В двух словах — в скрипте мы берем запись с именем tmp.wav, преобразуем во FLAC и отправляем в Google. Также сообщаем Гуглу, что хотим распознать русскую речь (хотя, если говорить на английском с нормальным произношением, то и текст приходит на английском). В ответ нам приходит сообщение вида {«status»:0,«id»:«4ee1ad1a44f3cfbb58341972dd008e9c-1»,«hypotheses»:[{«utterance»:«перезвоню позже»,«confidence»:0.43928865}]}

С помощью sed вытаскиваем текст сообщения, сохраняем его в лог и отправляем его на почту.

Для дальнейшего улучшения скрипта можно обратить внимание на confidence (коэффициент уверенности Google в качестве распознания) и отправлять его тоже на почту. Также или при низком confidence или в любом случае прикреплять к письму еще и вложение — файл записи. Это можно сделать с помошью опции "-a" для mutt, но советую предварительно сконвертировать файл в mp3.

Для записи же сообщения tmp.wav от позванившего абонента и последующего выполнения скрипта в нужный контекст плана набора FreeSWITCH я внес следующие строчки xml кода:

<extension name="s2t">
   <condition field="destination_number" expression="^11111$">
      <action application="export" data="api_hangup_hook=system /usr/local/freeswitch/scripts/s2t.sh"/>
      <action application="answer"/>
      <action application="playback" data="/usr/local/freeswitch/sounds/ru/RU/elena/voicemail/8000/vm-hello.wav"/>
      <action application="record" data="/usr/local/freeswitch/scripts/tmp.wav"/>
      <action application="hangup"/>
   </condition>
</extension>


Немного комментариев по приведенному куску плана набора FreeSWITCH. С помощью api_hangup_hook мы говорим FreeSITCH'у какой скрипт выполнить, после того как звонок завершится. Далее отвечаем на вызов и воспроизводим приветствие, после чего активируем запись в файл /usr/local/freeswitch/scripts/tmp.wav
После того как FreeSWITCH записал сообщение в файл tmp.wav и завершил телефонное соединение — вызывается скрипт /usr/local/freeswitch/scripts/s2t.sh, о котором я писал чуть выше.
Вот таким вот нехитрым способом можно, во-первых, облегчить себе жизнь, во-вторых, значительно сократить время обработки голосовых сообщений. Оцените насколько быстро (и даже не открывая письма) вы видите, о чем шла речь в сообщениях в интерфейсе mail.ru:

image
Share post

Similar posts

Comments 17

    +2
    Прикольная идея. А каково качество распознавания? Как часто вместо «колбаса» получается «конь босой»?
      0
      Качество неплохое, если хорошо говорить. Но фамилии, например, особенное какие-нибудь «эдакие» могут и из 10 попыток ни разу не распознаться. Тут стоит понимать, что это дает общее представление о голосовом сообщении. Соответственно поняв о чем речь можно отсеять это сообщение или наоборот уделить ему пристальное внимание и прослушать звук.
      +1
      «СкачОк»
        +4
        Спасибо, в личку уже тоже написали.
          +1
          Спасибо большое трем пользователям, кто сделал доброе дело и сообщил об опечатке в личку, плюс ребята разъяснили про то что 'скачек — это родительный падеж слова «скачки»'.
        +1
        Да вообще классная штука, но пока как игрушка. Думал когда то, ну допилю распознование команд, или там ещё чего интерактивненького, а гугл возьми и прикроет апи, страшно.
          0
          Из мыслей — можно ведь потом просто другие движки прикрутить, пусть и не такие качественные. Главное, чтобы разработка своя была качественная, а адаптировать функцию по распознаванию можно позже к чему угодно. Мне просто хотелось раскрыть идею, казалось бы так просто, но настолько удобно получается.
          0
          Классно, как раз в google voice это именно так и работает. Причем текс который он распознал «не уверненно», google voice помечает сереньким.
            0
            Не зря сервис сообщает «confidence» — по нему как раз можно ориентироваться. Например, можно писать письма в html формате и там уже определять цвет текста исходя из «confidence». Спасибо, хороший вектор идеи с цветом.
            0
            Пробовал раньше использовать этот сервис Google, но почему-то стабильно возвращалось utterance пустым.
            «Content-Type: audio/x-flac; rate=16000» -O — «www.google.com/speech-api/v1/recognize?lang=ru-RU&client=chromium»
            В Content-Type указывается audio/x-flac для wav-файлов?
              0
              Я отправляю flac — вот тут конвертирование:
              sox tmp.wav message.flac pad .1 0 rate 16k > /dev/null 2>&1
            0
            Лучше бы сделали простой способ: тыкнул кнопку адресата, поднял трубку, наговорил текст, текст отправился по мейлу в справочнике (это когда кнопку тыкал). А на приемной стороне человек берет зазвонившую трубку и прослушивает «мыло». Оплачиваем только интернет и электричество и больше никому и ничего=)
              0
              Предложение, конечно, интересное, но все же проще тогда mp3 файл пересылать по почте, а не так
              «неточное распознавание» --> «некачественный синтез и отсутствие интонации». А с mp3 получится без испорченного телефона во-первых, во-вторых, система может обойтись без услуг Google.
                0
                А потребителю долампочки что именно будет гулять по сети: текстовые файлы или звук сжатый. Начать можно с звука — это проще всего и к этому все готово. Делов-то — написать оригинальный почтовик.
                И почему этого до сих пор нет. Все IP-телефония =)
              0
              у гугла ограничение на длину распознаваемого текста есть. 'Привет, как дела, перезвони мне' наверное распознает, но на большее лучше не расчитывать.
                0
                Давайте продолжит мысль.
                Когда нам нужна услуга доставки голоса в почту? Чаще если мы за границей.
                Что нам нужно после пр. ослушивался / чтения сообщения? Ответить
                Номер абонента, например МТС передает в теме письма с голосовым файлом.
                Дальше есть два варианта:
                1 подключиться к смс шлюзу, и при ответе на письмо отправлять его абоненту множеством смс
                2 синхронизировать записную кишку с бд сервера, по мобильному номеру идентифицировать абонента и отправлять ответ на его е- почту

                Есть еще и изощренные варианты.
                Ответить на письмо текстом
                Превратить его голов (text2vose)
                Отправить входящщим звонком на номер из темы письма
                Получить обратно на почту статут доставки звонка (до звонился не до звонился, сколько %записи прослушал

                Only users with full accounts can post comments. Log in, please.