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

в 9:26, , рубрики: bash, freeswitch, Google, ip-телефония, linux, voicemail, wget, метки: , , , ,

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

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

Автор: joohny

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js