Voice flowを使って社内の番号登録していない人の携帯番号を検索

　はい、皆さんこんにちは。私はシステム会社の営業部員をしております。最近では企業へのサイバー攻撃やウィルスメール等でセキュリティがどんどん上がっていき、良い意味では何もしなくとも自分のPCが侵食される心配はありません。自社でもVPN（バーチャル・プライベートネットワーク）を採用しており自社サイト等は完全に守られているに違いありません。ただし、ネットワークを強固にするために逆に困っている事もあります。それは無線でのネットワーク通信の遅さです。
# 1.作成のきっかけ
　先輩から「社内の○○さんの携帯電話番号知らない。自社サイト5分探したけど見つからないし繋ぐと重いし遅いし時間の無駄なんだよね。」と言われ、その時は一緒になって探して確かこの場所にと目星がついている箇所を確認し、なんとか探し出せました。電話帳一覧がExcelになっていました。そこで、ピンときた私が思いついたのはVUI（Voice User Interface)機能を持った**Voice flow**を使った携帯番号検索を開発する事でした。


# 2.まずはVoice flowの完成動画

<blockquote class="twitter-tweet"><p lang="zxx" dir="ltr"><a href="https://t.co/axFjyqVnmB">pic.twitter.com/axFjyqVnmB</a></p>&mdash; imupion (@5cyyzToVdzLw0x4) <a href="https://twitter.com/5cyyzToVdzLw0x4/status/1538083295824838658?ref_src=twsrc%5Etfw">June 18, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 3.使用ツール

・[Voice flow](https://creator.voiceflow.com/)
・Googleスプレッドシート

https://support.google.com/docs/answer/6000292?hl=ja&co=GENIE.Platform%3DDesktop

# 4.作成手順
①最初にGoogleスプレッドシートに呼び出したい資料をコピーしておきます。
（今回はExcelで管理されていたファイルだったのですが、個人情報の記入があるためダミーを使用しました。）
![スクリーンショット 2022-06-18 223944.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/59dfe907-a217-e2b7-4c28-67e6c31f7bec.png)

②Voice flowにサインアップして（Googleアカウントを使うとスプレッドシートと連携しやすい）
Create Projectを押し、ChannelにAmazon Alexaを今回採用。Invocation Nameには題名を入力し、LocalesにはJapanese(JP)つまり日本語を採用し、Createボタンを押して始める。
<details><summary>参考</summary>

:::note info
インフォメーション
Voice flowの無料版は2つまでしか作成を保持出来ません。
:::
</details>

![スクリーンショット 2022-06-18 212942.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/596e38cb-0c9c-d6a7-c37b-0085564bb81d.png)
③左にあるツールバーからResponseの中のSpeakをdrag＆dropし、StartのBlockとLineで繋ぐ。SpeakBlockを開き話させたい文言を入力。
![スクリーンショット 2022-06-18 214829.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/afb4f3bf-ce51-ae60-32cb-6bff2bd6a1dd.png)
![スクリーンショット 2022-06-18 215456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/2fada7ee-c697-5a9c-bfa8-4ec97fef916f.png)
④turn2で部署名の質問文を投じた後はツールバーのUser Inputから今回はChoiceを選択しdrag＆drop。分岐を作ります。
　ここで初めて掛け合いが出来ます。部署名がなかったり違う事を発声した場合に戻って来れるようにリターンするリクエストも用意しておきます。
![スクリーンショット 2022-06-18 221156.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/368b67f0-5460-ff6b-428a-7aca87de418a.png)

:::note info
余談
この後作成中に分岐が増えすぎるのと要の番号検索に辿り着くまでに時間が掛かりそうだったので、部署名だけは敢えてセキュリティとして入れておきました。結果OKの場合、次に繋がるところは全部同じにしました。もう一つ理由としては他部署に異動しても携帯は同じだったりするのでこの流れにしました。
:::

turn3の中で選択する文言を判定させるため、キーワードに近い文言を学習させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/eb7b57d3-0a7c-cdbb-a869-d48a26c5d5cf.png)
⑤turn4で本題の人物検索に入ります。再度ツールバーのUser Inputから選択するのですが、今回はCaptureを選択しdrag＆drop。その後のBlockに組み合わせを意味するintegrationからGoogle Sheetsを選択しdrag＆drop。
![スクリーンショット 2022-06-18 223454.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/b8754752-1b15-7213-0af4-9931cae5e341.png)
⑥turn5では下図のように入力。{name}はGoogleスプレッドシートから名前を呼び出すために必須。
![スクリーンショット 2022-06-18 225630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/64452803-e2e3-afbb-d614-da3cedf30783.png)
⑦turn6のGoogle SheetsではRetrieve Dataで自分のGoogleアカウントを呼び出してSpreadsheetに先ほど作成したGoogleスプレッドシートを選択し必要なSheetを選択する。
　その後With Settingsには取り込む列nameとturn5で入力した変数{name}を入力。
　さらにMapping Outputでは呼び出す列のnumberとその値となるnumber（変数ではない）を入力。テストデータも確認しておく。
![スクリーンショット 2022-06-18 230055.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/3babf17b-78dc-d7cd-ed36-e3f93302edb0.png)
![スクリーンショット 2022-06-18 230336.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/ea18e9ed-ddc6-b096-5f81-52759a26f49b.png)
![スクリーンショット 2022-06-18 230647.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/d2af8a71-7e7d-68c0-b8f9-972583496897.png)
![スクリーンショット 2022-06-18 230739.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/81496239-c64a-9bed-6006-437da80154da.png)
![スクリーンショット 2022-06-18 230905.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/e48e124c-f783-c75b-d784-68ab50c55eb7.png)
⑧turn7にSpeakを置き下図の通りSSML（音声マークアップ言語）を使用しました。
![スクリーンショット 2022-06-18 233359.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/b6c10ecf-c6b6-2e35-292b-6be1817373ef.png)
⑨後は最後まで話が通じるようにChoiceとSpeakを繋げたり同様のBlockはコピーしました。
　完成したフロー図です。
![スクリーンショット 2022-06-18 165225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/f607fab2-1b3e-6f4c-6229-f05e12d251ae.png)
# 5.苦労した点
## その１
　turn7に入れる文言をAlexaが話す際、最初は電話番号で話さず数字として認識され「じゅうまん・・・」と返された時は「そうなるのか」と悩みました。過去にも同じような事やられていないか調べたら類似案件がありそれを引用させていただきました。
![スクリーンショット 2022-06-19 000715.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668403/50b71fad-0532-0ec2-72d4-34c8496352fe.png)

:::note info
引用記事
https://kun432.hatenablog.com/entry/voiceflow_tips_15_custom_api_integration_
:::

## その２
「メモの準備をお願いします。」を話した後にすぐに番号を続けて話すのでメモが取りづらいと感じたので間合いが出る言語を探し１秒間開ける事を見つけて入れましたが、逆に話さなくなってしまいましたのでそれは断念し、違う文言を入れる事にしました。たった今、文言に「電話番号」を追加変更しました。その方が会話が成り立ちます。
# 6.確認終えて反省
　改良の余地を残しましたが、テストもテキスト入力だったので少し寂しく思いました。Alexaも安価で手に入れられるのであれば本番実装したいです。テスト実装は出来たのでダミーを本番に変更し、先輩にも使ってもらいフィードバックをもらえたら良かったと反省です。ここまで読んでいただきありがとうございます。もしよければ前回記事も見ていただけると幸いです。

https://qiita.com/imurasho-ichi/items/968af949c600c1231024