電話機器人簡易原始碼分享,來自於匯德AI智慧電話機器人技術支援
在電銷競爭日趨激烈的今天,電銷從業人員每天加班加點,爭分奪秒的在篩選意向客戶,對企業來說,每挖掘出十個意向客戶,就意味著企業還能繼續生存下去。
正因電銷行業激烈的競爭,而人工智慧目前已是一個“風口”行業。眾多廠商和資本發現了其中存在的巨大商機,電話機器人便順勢而為如雨後春筍般出現,不亞於13年-15年外賣行業“百團大戰”的局面,因此在魚龍混雜的電話機器人市場裡如何找到一款有優秀又貼合企業自身情況的電話機器人,便成了一門“藝術”。
電話機器人的應用場景可以說十分廣泛,像金融、保險、房產、教育、汽車、服務、訊息通知等領域都離不開電銷,所以能否全面照顧到各行各業,需要相應的企業給予自己的外呼產品全面賦能。而不同場景的專業話術只需要錄入至電話機器人,它就可以根據資料進行相關領域的銷售工作了。
智慧電話機器人主要可以通過模擬真人語音完成專業電銷人員級的溝通,模擬電銷人員和客戶進行多輪互動的有效溝通,通過 使用者畫像和大資料模型精準找到使用者,實現精準營銷,並快速完成ABCD類意向客戶的篩選和分類。
那麼我們如何開發一個電話機器人呢? FreeSWITCH/Asterisk是一個軟交換系統,我們可以利用開源的軟交換系統,開發一個vad錄音模組,使用者說話後開始錄音,停止說話後,把錄音提交到語音識別介面轉換成本,利用語義解析介面(NPL)或者簡單的關鍵詞匹配。返回系統預先設計的話術,通過TTS轉換成聲音(也可以利用真人預先做好的錄音)播放給使用者聽。實現人機語音對話。
技術難點有兩個:
1.機器人說完話術,使用者開始說話,機器人要及時處理,就是我們說的打斷,這個我們需要通過VAD演算法和關鍵詞打斷來解決。 2.機器人要怎麼理解使用者說話的含義,這個在目前來說是非常大的難點,目前主要的做法,只能通過關鍵詞匹配來設計話術。 怎麼使用:
可以和現有的呼叫中心,IPPBX,FreeSWINTCH,Asterisk等系統通過SIP分機和SIP中繼方式對接。 smart ivr介面: smart ivr是一個基於Freeswitch的電話機器人二次開發介面(restful),支援和Asterisk對接。 使用說明:
使用者自己實現httpAPI,機器人程式去呼叫這個介面,不是機器人提高httpapi給使用者呼叫。 一.
外呼程式呼叫電話接通後,或者客戶主動呼入接通後 機器人程式 向 webserver post 傳送
二.
smartivr –> web
三.
"calleeid": "8888abc", //被叫號碼
"callerid": "abc", //主叫號碼
"callid": "1fe74812-e376-4319-b335-3de1b494325c", //每個通話的唯一ID
"errorcode": 0, //錯誤程式碼
"flowdata": null, //流程資料
"flowid": "abc", //流程ID
"notify": "enter" //通知型別
四.
webserver根據業務邏輯 返回 json資料 比如 下面的命令就是 啟動後臺ASR,並且播放一個聲音
五.
smartivr <– web
六. "action": "start_asr", //第一個動作 start_asr是一個非同步函式,只需要執行一次,啟動後會一直進行VAD和ASR,直到呼叫sotp_asr
"flowdata": "流程選擇", //流程資料,類似瀏覽器的Cookie,機器人後續httpapi請求會把這個資料傳送回來。
"params": {
"min_speak_ms": 100, //最小說話時間,預設值100,單位毫秒,說話時間小於這個值,會被認為是無效聲音。
"max_speak_ms": 10000, //最大說話時間,預設值10000,單位毫秒,說話時間超過這個值,就停止錄音,直接提交ASR伺服器識別。
"min_pause_ms": 300, //最小停頓時間,預設值300,單位毫秒,預設值使用者停頓時間超過這個值,會提交到ASR識別。識別完成後傳送asrprogress事件。 完成後的意思是 ASR伺服器可能 300-800ms才返回識別介面。
"max_pause_ms": 600, //最大停頓時間,預設值600,單位毫秒,使用者停頓時間超過這個值,認為一句話說完,所有識別完成後傳送asrmessage事件。所有識別完成後的意思是,所有提交到asr伺服器的識別結果都返回了。 注意 min_pause_ms 必須大於min_pause_ms。
"pause_play_ms": 200, //觸發暫停放音時間,預設值0:就是禁用自動暫停,單位毫秒,建議設定200-1000,使用者說話時間超過這個值,就暫停放音。 有時候使用者一直持續說話,中間沒停頓,所以還沒提交到ASR伺服器識別,不能使用關鍵詞打斷,可以先暫停放音。
"threshold": 0, //VAD閾值,預設0,建議不要設定,如果一定要設定,建議 2000以下的值。
"recordpath": "", //錄音檔案路徑,如果不設定:就會使用配置檔案中的路徑,每天生成一個資料夾,如果設定了,就會使用這個引數中的目錄,檔案格式是 recordpath/被叫號碼_Unique-ID_序號.wav
"volume": 50 //音量標準化的值。0-100,0不使用音量標準化,其他值 音量把錄音音量調整到這個值後,再提交ASR識別。
},
"after_action": "playback",
"after_ignore_error": false, //如果action動作(start_asr)執行失敗是否繼續執行after_action(playback)。
"after_params": {
"prompt": "您好,歡迎致電匯德智慧dianh軟體,這裡是電話機器人演示系統,請說要進入的測試流程,比如,房產!", //可以直接播放聲音檔案。規則就是如果最後4個字是.wav,就直接播放wav檔案。
"wait": 5000, //單位毫秒,放音結束後等待時間。用於等待使用者說話。
"retry": 0 //重播次數。就是wait時間內使用者不說話,就重新播放聲音。
機器人程式執行 “action”:”start_asr” 開始後臺ASR識別,然後執行”after_action”: “playback”開始播放聲音檔案。
七.
·當用戶說話後,機器人傳送 識別進度,也就是使用者暫停說話時間超過 min_pause_ms
smartivr –> web
"asrelapse": 391, //asr識別伺服器消耗的時間,單位毫秒。
"asrtextall": "1.識別結果;", //包含之前停頓的識別結果的組合。 格式是 錄音序號.識別結果;這樣組合多個識別結果。
"asrtype": "aiui", //本次使用那個asr識別
"calleeid": "8888abc",
"callerid": "abc",
"callid": "1aec14af-d6a8-49e4-96fc-fb5f7cfdb893",
"errorcode": 0, //asr返回錯誤,0無錯誤。
"flowdata": "流程選擇",
"flowid": "abc",
"message": "識別結果",
"notify": "asrprogress_notify",
"recordindex": "1", //錄音序號
"recordfile": "", //錄音檔案
"recordms": 931, //錄音時間,單位毫秒。
"volumegain": 5.95330699999 //音量標準化放大或者縮小的倍數。
webserver根據業務邏輯返回是否需要暫停放音
smartivr <– web
"action": "console_playback",
"flowdata": "流程選擇",
"params": {
"command": "pause"
當用戶說完一整句話,機器人傳送 完整的識別結果,也就是使用者暫停說話時間超過 max_pause_ms
smartivr –> web
"calleeid": "8888abc",
"callerid": "abc",
"callid": "ea6d1235-aaab-4251-b03b-3b53ca32e00d",
"errorcode": 0,
"flowdata": "流程選擇",
"flowid": "abc",
"message": "1.你好;2.什麼事;",
"notify": "asrmessage_notify",
"speakms": "1162" //整句話的說話時間,包含暫停時間
webserver根據業務流程,執行話說邏輯,播放聲音。
smartivr <– web
"action": "playback",
"flowdata": "回答",
"params": {
"prompt": "先生你好,請問你最近需要買房嗎",
"wait": 3000,
"retry": 2
·當用戶一直不說話,聲音播放完成並且等待時間超過,機器人傳送 playback_result
smartivr –> web
"calleeid": "8888abc",
"callerid": "abc",
"callid": "35bca774-5b3e-4129-a5e7-1c3c86605071",
"errorcode": 0,
"flowdata": "",
"flowid": "abc",
"message": "FILE PLAYED",
"notify": "playback_result"
webserver根據業務流程傳送 繼續放音,提示使用者回答問題。
smartivr <– web
"action": "playback",
"flowdata": "提示選擇流程",
"params": {
"prompt": "請問你要進入哪個測試流程,比如,房產",
"wait": 3000,
"retry": 2
playback_result 什麼時候有這個通知
執行 playback後,播放完成並且等待超時,就會發送playback_result 通知。
·如果識別到使用者說話,在 asrmessage_notify 事件中返回命令playback,播放了一個新的聲音,那麼上個playback會給強制終止(上次的playback_result就不會發送了。),新的播放完成時,才會傳送playback_result。
·如果識別到使用者說話,在 asrmessage_notify 事件中返回命令noop,或者console_playback(resume),沒去播放新的聲音,那麼還會發送playback_result 通知的。
·。
介面說明
注意:請求和返回都採用JSON格式,編碼為utf8,所有引數區分大小寫,數字和字串型別注意區分,引數未說明數字型別就是字串型別。
自動放音暫停(打斷)
start_asr 有一個引數 pause_play_ms,demo是200, 就是檢測到聲音持續時間時間超過pause_play_ms,就自動暫停放音。如果你不需要這個功能設定為0, 如果你啟用了這個功能,asrmessage_notify通知你沒播放一個新的聲音就必須要恢復放音console_playback(resume)。否則會一直暫停。
怎麼實現關鍵詞打斷
·asrprogress_notify 的識別結果如果是關鍵詞 返回 console_playback(pause),如果不是關鍵詞 返回 console_playback(resume)
·asrmessage_notify 的整句話識別結果如果匹配,直接播放新的聲音檔案,執行新的業務流程,如果不匹配,返回console_playback(resume)。
playback_result 收到這個通知,說明聲音播放完成,等待使用者說話超時,必須播放一個聲音,提示使用者說話
action 描述
start_asr
start_asr 是一個非同步函式,只需要執行一次,啟動後會一直進行VAD和ASR,直到呼叫sotp_asr
·min_speak_ms 最小說話時間,預設值100,單位毫秒,說話時間小於這個值,會被認為是無效聲音。
·max_speak_ms 最大說話時間,預設值10000,單位毫秒,說話時間超過這個值,就停止錄音,直接提交ASR伺服器識別。
·min_pause_ms 最小停頓時間,預設值300,單位毫秒,預設值使用者停頓時間超過這個值,會提交到ASR識別。識別完成後傳送asrprogress事件。 完成後的意思是 ASR伺服器可能 300-800ms才返回識別介面。
·max_pause_ms 最大停頓時間,預設值600,單位毫秒,使用者停頓時間超過這個值,認為一句話說完,所有識別完成後傳送asrmessage事件。所有識別完成後的意思是,所有提交到asr伺服器的識別結果都返回了。 注意 min_pause_ms 必須大於min_pause_ms。
·pause_play_ms 觸發暫停放音時間,預設值0,就是禁用自動暫停,單位毫秒,建議設定200-1000,使用者說話時間超過這個值,就暫停放音。 有時候使用者一直持續說話,中間沒停頓,所以還沒提交到ASR伺服器識別,不能使用關鍵詞打斷,可以先暫停放音。
·threshold VAD閾值,預設0,建議不要設定,如果一定要設定,建議 2000以下的值。
·recordpath 錄音檔案路徑,如果不設定(使用配置檔案設定錄音目錄(smartivr.json),),如果設定了會保存錄音檔案到這個目錄,檔案格式是 recordpath/被叫號碼Unique-ID序號.wav
·volume 音量標準化的值。0-100,0不使用音量標準化,其他值 音量把錄音音量調整到這個值後,再提交ASR識別。
start_asr使用的配置檔案
linux /etc/smartivr.json,windows freeswitchconsole.exe同一個目錄
"asr": {
"aiui": {
"key1": {
"appid": "5a519267",
"appkey": "e212fc8e4c9747a39fa1c56940e705be"
},
"key2": {
"appid": "5a519267",
"appkey": "e212fc8e4c9747a39fa1c56940e705be"
·}
* record.path 是錄音路徑。
playback
播放一個聲音檔案
·prompt 聲音內容wav檔案(只支援8000hz,16位,單聲道)或者文字。prompt 提示文字(如果最後4個字是.wav,就是錄音檔案放音,否則會呼叫TTS生成聲音檔案)。同樣的文字TTS只轉換一次,後續會使用快取的檔案
·wait 單位毫秒,放音結束後等待時間。用於等待使用者說話。
·retry 重播次數。就是wait時間內使用者不說話,就重新播放聲音。
多檔案或者TTS和錄音檔案混合放音
prompt 使用數值方式就可以,比如
"/var/wav/1.wav",
"tts文字轉聲音",
"/var/var/2.wav"
sotp_asr
停止後臺ASR。
console_playback
用於播放控制,使用者說話開始,先暫停播放,如果說的是無效聲音,可以恢復播放。
·command
·pause 暫停播放
·resume 恢復播放
·stop 停止播放
bridge 轉接電話
{"action":"bridge","flowdata":"","params":{"number":"sofia\/external\/[email protected]:16080","callerid":"","gateway":"","prompt":"\u6b63\u5728\u8f6c\u63a5\u4e2d\uff0c\u8bf7\u7b49\u5f85","background":"wating.wav"}}
* number 被叫號碼,如果gateway沒設定,必須是完整呼叫串類似:sofia/external/電話號碼@閘道器Ip
* callerid 可選引數 主叫號碼(對方看到的來電顯示)
* gateway 可選引數 閘道器名字
* background 可選引數 背景音樂
* prompt 可選引數 提示文字prompt 提示文字(如果最後4個字是.wav,就是錄音檔案放音,否則會呼叫TTS生成聲音檔案)。
hangup 掛機
{"action":"hangup","params":{"usermsg":"not found notify"}}
* cause [數字] 可選引數 結束通話原因根據sip信令設定 詳細看https://freeswitch.org/confluence/display/FREESWITCH/Hangup+Cause+Code+Table
* usermsg 可選引數 裡面可以放置除錯資訊,smartivr會列印到日誌檔案。
noop 不需要執行任何動作時可以返回這個,比如(leave,asr_progress 通知可以返回noop)
{"action":"noop","params":{"usermsg":""}}
* usermsg 可選引數 裡面可以放置除錯資訊,smartivr會列印到日誌檔案。
deflect 執行後會直接離開流程,收到 leave 通知
{"action":"deflect","flowdata":"","params":{"number":"1001"}}
* number 要轉移的目的地(由呼叫方處理) 即: SIP REFER 的 URI。
getdtmf 接收使用者按鍵
{"action":"getdtmf","flowdata":"","params":{"prompt":"","invalid_prompt":"","min":0,"max":128,"tries":1,"timeout":5000,"digit_timeout":3000,"terminators":"#"}}
* min [數字] 最少按鍵個數(minimum value of 0)
* max [數字] 最多按鍵個數(maximum value of 128)
* tries [數字] 提示音播放次數
* timeout [數字] 等待按鍵最大時間,聲音播放結束開始算起。
* terminators 結束輸入按鍵,預設是#。
* prompt 提示音
* invalid_prompt 輸入錯誤提示音
* regexp 輸入按鍵規則(正則表示式)
* digit_timeout [數字] 按鍵超時時間,如果超時沒有新按鍵,就認為輸入完成。
我們專致力於營銷推廣獲客領域,專注做獲客工具及解決方案,累積有豐富的研發和策劃經驗。集團秉承以“誠信、創新、發展、共贏”為基礎, 一切以客戶需求為出發點,對消費者權益負責、對社會負責。幫助各行業實現企業獲客自動化、 標準化,提高獲客效率,共享網際網路智慧營銷紅利。百度搜索(匯德AI智慧電話機器人)或撥打下方電話,定製您的專屬電銷客服。