いつものように、無料のVoxImplant開発者アカウント( ここから入手可能 )と空き時間が必要です。 そのため、VoxImplantの機能をさらに実証するために、ロシアの都市に電話するように求め、選択した都市の天気予報を伝えるIVRを行います。 天気情報については、weather.yandex.ruサービスを使用します。 VoxImplantコントロールパネルに移動し、[アプリケーション]セクションで新しいアプリケーションを作成し、それをivrと呼ぶことができます。 シナリオセクションに移動して、次の形式の新しいスクリプトを作成します。
// require(Modules.ASR); var call, asr, city, cityId, Weather = {}, // Yandex Weather.cities tts_voice = Language.RU_RUSSIAN_FEMALE; // text-to-speech // function getCities() { var opts = new Net.HttpRequestOptions(); opts.rawOutput = true; Net.httpRequest("http://weather.yandex.ru/static/cities.json", function (e) { if (e.code == 200) { // json octet-stream var response = bytes2str(e.data, 'utf-8'); // Weather.cities eval(response); } else Logger.write("Couldn't load cities. Status: " + e.code); }, opts); } // id - function getCityId(name) { for (var i in Weather.cities) { var country = Weather.cities[i]; for (var k in country) { if (k.toLowerCase() == name.toLowerCase()) return country[k]; } } return -1; // } // ( ), , , VoxEngine.addEventListener(AppEvents.Started, function (e) { getCities(); call = VoxEngine.callPSTN(" ", " "); // , , Voximplant , caller id call.addEventListener(CallEvents.Connected, handleCallConnected); // call.addEventListener(CallEvents.Failed, cleanup); call.addEventListener(CallEvents.Disconnected, cleanup); }); // ( ) VoxEngine.addEventListener(AppEvents.CallAlerting, function (e) { getCities(); call = e.call; call.answer(); // call.addEventListener(CallEvents.Connected, handleCallConnected); // call.addEventListener(CallEvents.Disconnected, cleanup); }); // function handleCallConnected(e) { call.say("! , .", tts_voice); enableASR(); } // function enableASR() { // ASR, , - ( ) asr = VoxEngine.createASR(ASRLanguage.RUSSIAN_RU, ASRDictionary.ADDRESS_RU); // , asr.addEventListener(ASREvents.CaptureStarted, function (e) { call.stopPlayback(); }); asr.addEventListener(ASREvents.Result, handleRecognitionResult); // ASR call.sendMediaTo(asr); } // function handleRecognitionResult(e) { // ASR asr.stop(); // 50% if (e.confidence >= 50) { city = e.text; if (city.toLowerCase() == "") city = "-"; // cityId = getCityId(city); if (cityId == -1 && /\s/g.test(city)) { Logger.write("Replacing whitespace"); city = city.replace(/\s/g, "-"); cityId = getCityId(city); } if (cityId !== -1) { call.say(" " + city, tts_voice); call.addEventListener(CallEvents.PlaybackFinished, handleCityChosen); } else { call.say(" , . , , .", tts_voice); enableASR(); } } else { call.say(" , . , , .", tts_voice); enableASR(); } } // function declOfNum(number, titles) { cases = [2, 0, 1, 1, 1, 2]; return titles[(number % 100 > 4 && number % 100 < 20) ? 2 : cases[(number % 10 < 5) ? number % 10 : 5]]; } // function handleCityChosen(e) { call.removeEventListener(CallEvents.PlaybackFinished, handleCityChosen); // cityId Net.httpRequest("http://export.yandex.ru/weather-ng/forecasts/" + cityId + ".xml", function (e) { if (e.code == 200) { Logger.write("Weather info has been loaded"); var data = e.text.split("\n").slice(1).join("\n"), forecast = new XML(data), ns = new Namespace('w', 'http://weather.yandex.ru/forecast'), temperature = forecast.ns::fact.ns::temperature, humidity = forecast.ns::fact.ns::humidity, pressure = forecast.ns::fact.ns::pressure, wind_speed = forecast.ns::fact.ns::wind_speed; wind_speed = parseFloat(wind_speed).toFixed(1).replace(/\.0{1}$/, ""); var forecast_string = " " + parseNumber(temperature) + " " + declOfNum(Math.abs(temperature), ['', '', '']) + ", " + forecast.ns::fact.ns::weather_type + ", " + parseNumber(humidity) + " " + declOfNum(humidity, ['', '', '']) + ", " + " " + parseNumber(pressure) + " " + declOfNum(pressure, ['', '', '']) + " , " + " " + parseNumber(wind_speed) + " " + declOfNum(wind_speed, ['', '', '']) + " "; // call.say(forecast_string, tts_voice); call.addEventListener(CallEvents.PlaybackFinished, VoxEngine.terminate); } else { Logger.write("Couldn't load weather info. Status: " + e.code); call.say(" , . , .", tts_voice); call.addEventListener(CallEvents.PlaybackFinished, VoxEngine.terminate); } }); } // function cleanup(e) { Logger.write("Cleanup"); VoxEngine.terminate(); }
あなたの電話番号に置き換えることを忘れないでください
call = VoxEngine.callPSTN(" ", " ");
、数字の形式は7hhhhhhhhhh、まあ、またはロシアにいない場合は別の国コードです。 また、発信元の番号を示します。 Voximplantコントロールパネルから番号を確認できます。 保存して、SmartIVRスクリプトを呼び出すことができます。 コードを注意深く見ると、どこにも宣言されていないparseNumber関数があることに気づきました。 呼び出すときに、実行されたスクリプトを組み合わせることができるため、別のスクリプトparseNumberを作成して、この関数のコードをそこに挿入できます。
var parseNumber = function () { var dictionary = [ ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" ], ["", "", "", "", "", "", "", "", "", ""], ["", "", "", "", "", "", "", "", "", ""], ["|||", "|||", "|||", "|||"] ]; function getNumber(number, limit) { var temp = number.match(/^\d{1,3}([,|\s]\d{3})+/); if (temp) return temp[0].replace(/[,|\s]/g, ""); temp = Math.abs(parseInt(number)); if (temp !== temp || temp > limit) return null; return String(temp); }; function setEnding(variants, number) { variants = variants.split("|"); number = number.charAt(number.length - 2) === "1" ? null : number.charAt(number.length - 1); switch (number) { case "1": return variants[0] + variants[1]; case "2": case "3": case "4": return variants[0] + variants[2]; default: return variants[0] + variants[3]; }; }; function getPostfix(postfix, number) { if (typeof postfix === "string" || postfix instanceof String) { if (postfix.split("|").length < 3) return " " + postfix; return " " + setEnding(postfix, number); }; return ""; }; return function (number, postfix) { if (typeof number === "undefined") return "999" + new Array(dictionary[3].length + 1).join(" 999"); number = String(number); var minus = false; number.replace(/^\s+/, "").replace(/^-\s*/, function () { minus = true; return ""; }); number = getNumber(number, Number(new Array(dictionary[3].length + 2).join("999"))); if (!number) return ""; postfix = getPostfix(postfix, number); if (number === "0") return "" + postfix; var position = number.length, i = 0, j = 0, result = []; while (position--) { result.unshift(dictionary[i++][number.charAt(position)]); if (i === 2 && number.charAt(position) === "1") result.splice(0, 2, dictionary[0][number.substring(position, position + 2)]); if (i === 3 && position !== 0) { i = 0; if (position > 3 && number.substring(position - 3, position) === "000") { j++; continue; }; result.unshift(setEnding(dictionary[3][j++], number.substring(0, position))); }; }; position = result.length - 5; switch (result[position]) { case "": result[position] = ""; break; case "": result[position] = ""; break; }; if (minus) result.unshift(""); return result.join(" ").replace(/\s+$/, "").replace(/\s+/g, " ") + postfix; }; }();
スクリプトを保存し、parseNumber関数の名前で呼び出すことができます。 誰かが望んでいる場合は、小数を単語に変換できるように関数を変更できます:)ルール(ルール)を使用してスクリプトをアプリケーションに添付し、その後、電話に最初のテスト呼び出しを行うことができます。 これを行うには、[アプリケーション]セクションに移動し、以前に作成したivrアプリケーションを編集します-[ルール]セクションに移動して[ルールの追加]をクリックします。 ルールは任意に呼び出すことができます。現在、発信呼び出しのルールを作成しているため、OutboundTestを呼び出してパターンのままにしておくことができます。*、HTTP APIパターンを介してスクリプトを開始するときは考慮されません(ルールIDはリクエストで指定されます)。 parseNumberとSmartIVRをドラッグアンドドロップして、Assignedに保存します(スクリーンショットを参照)
その後、新しく作成したルールにカーソルを合わせると、起動、編集、削除の3つのボタンが表示されます。 最初に興味があります。
実際には、 HTTP APIで説明されているStartScenariosメソッドを簡単に呼び出すことができるダイアログが表示されます 。
電話番号を正しく入力した場合、(実行)ボタンをクリックした後、着信コールを受信し、ロシアの都市の名前を尋ねられます。システムが都市を認識し、Yandex天気データベースでそれを見つけると、彼らはこの都市の現在の天気について通知します。 もちろん、電話番号を取得してこのシナリオに添付して、IVRが着信コールに対して機能するようにできます。この場合、AppEvents.Startedハンドラーにコメントすることを忘れないでください。そうしないと、システムはすべてのIVRコールで番号に発信コールを行います:)番号は、セクションの電話番号> 私の電話番号のセクションでアプリケーションに添付されます 。その後、アプリケーションのルール(ルール)を作成する必要があります。
PS ブログの VoxImplant を使用して、メニューから通常のIVRの作成について読むことができます。