録音した音声やリアルタイムの音声入力をテキストに変換することできるPythonライブラリの「SpeechRecognition」を活用します。
◎音声認識の自動受付イメージ
【人】[202]をダイヤルする。
↓
【PC】「お電話ありがとうございます。こちらは○○商事でございます。自動音声で対応て頂きす。ご用件をお話ください。」
↓
【人】「営業部をお願い致します。」
↓
【PC】”えいぎょう”を音声認識する。
↓
【PC】「営業部にお繋ぎ致します。」
↓
内線20の電話機を呼び出す。
————————————————————————————————-
Pythonで音声をテキストに変換するコードを作成する。
まず、必要なライブラリ「flac」、「SpeechRecognition」、「pykakasi」、「pyst2」をインストールする。
flacコーデックライブラリのインストール
sudo apt-get install --break-system-packages flac
「SpeechRecognition」録音した音声やリアルタイムの音声入力をテキストに変換します。
sudo pip install --break-system-packages SpeechRecognition
「pykakasi」漢字をひらがなやローマ字にすることができる。
sudo pip install --break-system-packages pykakasi
Asteriskライブラリのインストール
pip install --break-system-packages asterisk
Asterisk用agiライブラリのインストール
pip install --break-system-packages pyst2
以上でAsteriskでSpeechRecognitionを使用するための環境設定は完了です。
「/var/lib/asterisk/agi-bin/」に新規にコード「speech_rec.py」を作成します。
sudo nano /var/lib/asterisk/agi-bin/speech_rec.py
#!/usr/bin/python3 # coding:utf-8 from pykakasi import kakasi import speech_recognition as sr from asterisk.agi import * import sys DIR = '/var/spool/asterisk/monitor/' agi = AGI() r = sr.Recognizer() with sr.AudioFile(DIR+sys.argv[1]) as source: audio = r.listen(source) try: text = r.recognize_google(audio, language='ja-JP') except sr.UnknownValueError: text='エラー' kks = kakasi() result = kks.convert(text) text = ''.join([item['hira'] for item in result]) if 'えいぎょう' in text: agi.set_variable('ret_num', '20') agi.set_variable('ret_text', 'えいぎょうぶ') elif 'そうむ' in text: agi.set_variable('ret_num', '21') agi.set_variable('ret_text', 'そうむぶ') elif 'けいり' in text: agi.set_variable('ret_num', '22') agi.set_variable('ret_text', 'けいりぶ') else: agi.set_variable('ret_num', '99')
「speech_rec.py」を実行可能にします。
sudo chmod 755 /var/lib/asterisk/agi-bin/speech_rec.py
尚、Asterisk上で動きますが、直接コマンドラインで正常に動きません。
————————————————————————————————-
次に「extensions.conf」の内容を編集する。
sudo nano /etc/asterisk/extensions.conf
以下の内容を「extensions.conf」に追記します。
[IVR-menu-voice] exten => s,1,Answer() same => n,wait(2) same => n,agi(googletts.agi,"こちらは○○商事でございます。自動音声で対応て頂きす。ご用件をお話ください。",ja) same => n(continue),Set(FILE=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}) same => n,Set(MONITOR_DIR="/var/spool/asterisk/monitor/") same => n,MixMonitor(${FILE}.wav,a r(${FILE}-in.wav)) same => n,wait(5) same => n,StopMixMonitor() same => n,wait(2) same => n,agi(speech_rec.py,${FILE}-in.wav) same => n,wait(1) same => n,Verbose(返り値はret_num、${ret_num}) same => n,GotoIf($[${ret_num::2} != 99]?connecting) same => n,agi(googletts.agi,"もう一度、ご用件をお話しください。",ja) same => n,Goto(continue) same => n(connecting),agi(googletts.agi,"${ret_text}にお繋ぎいたしますので少々お待ちください。",ja) same => n,Dial(PJSIP/${ret_num:0:2}) same => n,Hangup()
設定内容を有効にするためにサービスの再起動
sudo systemctl restart asterisk.service
【動作確認】「202」をダイヤルして、アナウスを聴き、「営業部をお願い致します。」と内線20を呼出す事が出来たら成功です。
————————————————————————————————-
MixMonitor(filename.extension,options)
StopMixMonitor()
ダイヤルプラン実行中に音声録音ファイルmp3が作成されます。StopMixMonitor()で録音を停止します。
filename.extension = 録音するファイル名
options = a: 追加でfileを作成する。
t(file): fileに送信音声を録音する。
r(file): fileに受信音声を録音する。