Swiftを使って音声制御の対話アプリケーションを作ってみる

音声認識アプリケーション

ここ最近では、音声認識を標準の入出力方法としたソフトウェアアプリケーションが普通に出てきていますね。IBM Watsonでは様々なCognitive APIが用意されており、こちらをかんたんにIBM Cloud (Bluemix) から利用する事が可能です。今回はこちらを使って、ちょっとした音声制御のアプリケーションの作り方をご案内したいと思います。
本ブログでの解説をWebinarとして実施した際のアーカイブは以下よりご覧頂けます。

9/13に実施したWebinar

Swiftアプリケーション

IBM Cloud (Bluemix) では、サーバーサイドSwiftを利用する事が可能です。Swiftと言えば元々はApple向けのアプリケーションを作成するためにAppleで開発が進められ、後にオープンソース化、そしてサーバーサイドへの対応、となりました。ここでは、このSwiftを使いiOSアプリケーションを作成します。もちろんサーバーサイドもSwiftで構築します。iOSアプリケーションを作成するので、ここでの解説はMacでの開発を前提として進めていきます。

IBM Code

こちらに公開されている構築手順を解説していきます。英語で読み進められる方は、オリジナルサイトに沿って試してみても良いと思います。
https://developer.ibm.com/code/journey/build-a-cognitive-recommendation-app-with-swift/

Cognitive Concierge Application

今回作成するアプリケーションは対話型でおすすめ情報を提案してくれる、コンシェルジュアプリケーションです。

Cognitive Concierge Application

システム構成

システム全体構成

全体のシステム構成のイメージはこんな感じです。ユーザーはiPhoneでこのアプリケーションを実行します。裏ではIBM WatsonのConversation、Text to Speech、Speech to Text、NLU(Natural Language Understanding)を適宜呼び出しながらインタラクティブなUXを実現しています。

Codeの取得

IBM Code (https://developer.ibm.com/code/journey/build-a-cognitive-recommendation-app-with-swift/) へアクセスし、「Get the code」をクリックします。

GitHubのページへ移動するので、こちらのREADME.mdに従って進めて行けば、アプリケーションを作成することができます。

事前に準備しておくことが5つあります。
1. Google APIのキーを取得 (https://console.developers.google.com/flows/enableapi?apiid=places_backend&reusekey=true)
2. Carthageのインストール (https://github.com/Carthage/Carthage/releases)
3. CocoaPodsのインストール (https://cocoapods.org/?q=cvxv)
4. Xcode
5. IBM Cloud (Bluemix) アカウント
6. CLI ツール (Cloud Foundry / Bluemix)

CodeのCloneとIBM Cloud (Bluemix) へのデプロイ

GitHubのReadmeでは、サーバーサイドアプリケーションを構築する3つの方法が書かれています。今回はこの中から、c)の「Bluemixコマンドライン」で行う手順を解説したいと思います。

Bluemixコマンドラインでの手順

ターミナルから、任意のディレクトリへ移動します。移動したら、次のコマンドでGitリポジトリをCloneします。

git clone https://github.com/IBM/CognitiveConcierge.git

Cloneが完了したら、プロジェクトのroot階層へ移動し、次のコマンドでBluemixの自分のスペースへ4つのサービスを作成します。サービスを作成したい地域、組織、スペースへ予めログインしておいて下さい。

$ bluemix login -u xxx@gmail.com -o IBM -s dev
API エンドポイント: https://api.ng.bluemix.net
Password>
認証中です...
OK
ターゲットの組織 IBM
ターゲットのスペース dev
$ Cloud-Scripts/services/services.sh
Creating services...
'cf create-service conversation free CognitiveConcierge-Conversation' を起動しています...
xxx@gmail.com としてサービス・インスタンス CognitiveConcierge-Conversation を組織 IBM / スペース dev 内に作成しています...
OK
'cf create-service speech_to_text standard CognitiveConcierge-Speech-To-Text' を起動しています...
xxx@gmail.com としてサービス・インスタンス CognitiveConcierge-Speech-To-Text を組織 IBM / スペース dev 内に作成しています...
OK
注意: サービス `speech_to_text` のプラン `standard` は無料ではありません。  インスタンス `CognitiveConcierge-Speech-To-Text` はコストを発生させます。  これが誤りであると思われる場合は、管理者にお問い合わせください。
'cf create-service text_to_speech standard CognitiveConcierge-Text-To-Speech' を起動しています...
xxx@gmail.com としてサービス・インスタンス CognitiveConcierge-Text-To-Speech を組織 IBM / スペース dev 内に作成しています...
OK
注意: サービス `text_to_speech` のプラン `standard` は無料ではありません。  インスタンス `CognitiveConcierge-Text-To-Speech` はコストを発生させます。  これが誤りであると思われる場合は、管理者にお問い合わせください。
'cf create-service natural-language-understanding free CognitiveConcierge-NLU' を起動しています...
xxx@gmail.com としてサービス・インスタンス CognitiveConcierge-NLU を組織 IBM / スペース dev 内に作成しています...
OK
Services created.

サービスの作成が完了したら、アプリケーションをpushします。
と、本家サイトでは書かれているのですが、一点注意です。Readme.mdに記載が無いのですが、実はサーバーサイドSwiftのソースコード内にもGoogle Place APIのキーを埋め込まなくてはなりません

プロジェクトのroot/CognitiveConcierge-Server/Sources/main.swift を編集します。APIキーを記載するのと、探しに行く地域のgeocode(緯度経度)を設定します。
(geocodeはcloneしてきたままだとラスベガスになってます)

struct Constants {
 static var googleAPIKey = “ここにあなたのGoogle Place APIのキーを記載
 static var location = “36.11,-115.17”
}

ここまで編集したらpushします。プロジェクトのrootにいることを確認してからpushコマンドを実行して下さい。

$ bx app push
'cf push' を起動しています...
マニフェスト・ファイル /Users/xxx/Documents/GitHub/CognitiveConcierge/manifest.yml を使用しています
xxx@gmail.com としてアプリ CognitiveConcierge を組織 IBM / スペース dev 内に作成しています...
OK
経路 cognitiveconcierge-unbacterial-oud.mybluemix.net を作成しています...
OK
cognitiveconcierge-unbacterial-oud.mybluemix.netCognitiveConcierge にバインドしています...
OK
CognitiveConcierge をアップロードしています...
次のパスからアプリ・ファイルをアップロードしています: /Users/taiji/Documents/GitHub/CognitiveConcierge/CognitiveConcierge-Server
11.1K、12 個のファイルをアップロードしています
Done uploading
OK
xxx@gmail.com
としてサービス CognitiveConcierge-Conversation を組織 IBM / スペース dev 内のアプリ CognitiveConcierge にバインドしています...
OK
xxx@gmail.com
としてサービス CognitiveConcierge-Speech-To-Text を組織 IBM / スペース dev 内のアプリ CognitiveConcierge にバインドしています...
OK
xxx@gmail.com
としてサービス CognitiveConcierge-Text-To-Speech を組織 IBM / スペース dev 内のアプリ CognitiveConcierge にバインドしています...
OK
xxx@gmail.com
としてサービス CognitiveConcierge-NLU を組織 IBM / スペース dev 内のアプリ CognitiveConcierge にバインドしています...
OK

xxx@gmail.com
として組織 IBM / スペース dev 内のアプリ CognitiveConcierge を開始しています...
Downloading swift_buildpack...

〜 中略 〜

アプリが開始されました

OK
アプリ CognitiveConcierge はコマンド `restaurant-recommendations -bind 0.0.0.0:$PORT` を使用して開始されました
xxx@gmail.com として組織 IBM / スペース dev 内のアプリ CognitiveConcierge の正常性と状況を表示しています...
OK
要求された状態: started
インスタンス: 1/1
使用: 512M x 1 インスタンス
URL: cognitiveconcierge-unbacterial-oud.mybluemix.net
最終アップロード日時: Thu Aug 31 05:30:55 UTC 2017
スタック: cflinuxfs2
ビルドパック: swift_buildpack
状態   開始日時                 CPU    メモリー        ディスク      詳細
#0
実行 2017-08-31 02:35:51 PM 0.0% 512M の中の 0 1G の中の 0

サービスの資格情報

作成した4つのサービスの資格情報を作成します。作成した資格情報は、後ほどiOSアプリケーション作成時に使用しますので、メモ帳などに控えておいてください。
IBM Cloud (Bluemix) のダッシュボードから、各サービスを選択し、資格情報メニューから新規資格情報を作成します。

サービスの選択
新規資格情報の作成

Conversationワークスペースの作成

Cloneしたリポジトリの中には、今回のアプリケーションで使うことができるチャットのフローを定義したワークスペースのJSONファイルが含まれています。こちらを利用しましょう。
Resources/conversationWorkspace.json
このファイルを、Watson Conversationツールへインポートしワークスペースを作成します。ツールは、サービスの管理メニューからLaunchすることができます。

ツールのLaunch
JSONのインポート
conversationWorkspace.json を選択し読み込む

JSONファイルを正常に読み込むと、「Recommendations-v1」という名称でワークスペースが作成されます。この中には今回のアプリで利用できる基本的な会話の定義が含まれています。

後ほど、iOSアプリケーション作成時に使用しますので、ワークスペースIDをコピーし控えておいてください。

View details を選択
ワークスペースID

iOSアプリケーションの作成

では、ここからはiOSアプリケーション作成になります。Xcodeで作業を進めていきます。
先ずは、ターミナルで作業ディレクトリを ProjectRoot/CognitiveConcierge-iOS へ移動し、次のコマンドで依存関係ファイルを取り込みます。この処理は少し時間がかかる場合があります。

carthage update --platform iOS
pod install

そうしたら、次のコマンドを実行しXcodeを起動します。

open CognitiveConcierge.xcworkspace

Xcodeで、CognitiveConcierge.plistを編集します。前の手順でメモ帳などに控えておいてもらったものです。

ConversationPassword => 資格情報に記載のpassword
ConversationUsername => 資格情報に記載のusername
ConversationVersion => デフォルト値でOK
ConversationWorkspaceID => Conversationツールに記載のワークスペースID
SpeechToTextPassword => 資格情報に記載のpassword
SpeechToTextUsername => 資格情報に記載のusername
TextToSpeechPassword => 資格情報に記載のpassword
TextToSpeechUsername => 資格情報に記載のusername
googlePlacesAPIKey => 事前に取得したAPIキー
CognitiveConcierge.plist

次にbluemix.plistを編集します。実際にご自身のIBM Cloud (Bluemix) 上で稼働しているサーバーアプリのURLを設定します。このサーバーアプリは前の手順でIBM Cloud (Bluemix) 上へpushしたアプリケーションになります。

bluemix.plist

iOSアプリケーションの実行

これですべての作業が完了しました。Xcodeで実行対象のデバイスを選択しビルドを行います。実機を繋いでなければエミュレーターが起動し、アプリケーションが実行されます。実機にビルドする場合はSigningを正しく設定して下さい。

iOSアプリケーションの実行
TOP画面
チャット画面
リコメンド結果画面

まとめ

いかがでしたでしょうか?Swiftを使って、クライアント(iOS)アプリとサーバーサイドアプリを、かんたんに構築することができることを体感いただけたのではないでしょうか。
また、サーバーサイドではWatsonのAPIを使って音声認識、対話、自然言語理解、といった機能を実現することができました。
今回のこのアプリケーションをベースに、色々とアレンジしてみると楽しいと思います。
それでは楽しいCloud Lifeを!

―――――――――――――――――――――――――――――――――――――――

Information

IBM Developer Advocate Profile
https://developer.ibm.com/code/community/advocates/#!/advocate/taijih@jp.ibm.com

Cloud Developers Circle
(ベンダー依存しないクラウドデベロッパーのためのコミュニティ)
https://cdevc.connpass.com/

Node-RED ユーザーグループ
https://node-red.connpass.com/

IBM Cloud ユーザーグループ
https://bmxug.connpass.com/

Like what you read? Give Taiji a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.