オープンAPIを備えたAndroid AI



今日の怠け者だけが、 Siriの音声アシスタント何であるかを知りません。 2年前、この製品が新しいiPhone 4Sのプレゼンテーションで披露されたとき、多くの人がIT業界の発展を新しい方法で見ていました。 実際、自然な音声を理解するポケットに入れられた人工知能は、まだ誰にも示されていません。



当時の多くは、Appleが次のWWDCですでにiOSのすべてのプログラマーにSiriのオープンAPIアシスタントを自分のプログラムに使用する機会を提供できると言い始めました。 画像はバラ色でした-あらゆるアプリケーションは、さまざまなコマンドを実行することでユーザーフレーズに応答できました。 実際、AppStoreに非常に多くの便利なアプリケーションが存在する場合、それらに音声制御を与えてはどうでしょうか? さらに、iPhone 4sのリリース後、スピーチなどのユーザーとのコミュニケーションが急速に流行しました。



Appleがこれを行うことができたかどうか、そして私たちが何とかできるかについて、読み進めてください。







時間が経ちましたが、Siri APIは表示されませんでした





大多数は、 音声認識と、 人工知能としてのアシスタントの実際の能力を単に混同していることに注意すべきです。 これら2つの概念には大きな違いがあります-音声認識(音声合成)ソリューションは長い間市場に出回っています(たとえば、Android OSでは誰でも利用可能です)が、対話システムのオープンテクノロジーを作成するには(コンテキストサポート、意味の抽出を使用など)誰もまだ成功していません。 また、多くの人は、Siriの人の単一のシンクタンクAIへの多くのプログラムの一般的なアクセスで発生する問題の数について考えませんでした。 プログラマーが対処しなければならない完全に新しいテクノロジーも含まれます。



オープンでアクセス可能な「人工知能」APIを備えた音声アシスタントを作成するというアイデアは、当時私たちの頭の中にあり、それを実装することにしました。



ロシア語のアシスタント





イニシアチブ開発者の私たちの小さなグループは、ロシア語でアシスタントとして知られているプロジェクトを取り上げました。



このような音声プラットフォームを作成するには、認識技術(ASR)や音声合成(TTS)などの専門分野の知識と、ユーザーの音声から意味を抽出して対話コンテキストを管理できるNLPが必要です。 人工知能システムのバインダーとなるのはこのコンポーネントであり、音声をテキストに変換するだけでなく、ユーザーが望むものを理解することもできます。 これにより、音声認識技術と人工知能技術が区別されます。



私たちの目標は、これらの技術を使用するための手頃な価格のツールを作ることでした。



起動時までに、アプリケーションはスピーチの助けを借りてユーザーの日常のタスクを巧みに解決することができました。 また、AndroidバージョンのJellyBeanのユーザーは、インターネットに接続せずに音声コマンドを実行できます。



人工知能Open API



初日から、各「ロシア語アシスタント」サービスは、将来すべての人のためにオープンする予定の同じプラットフォームに基づいて作成されました。 この原則は、英語で「 自分のドッグフードを食べる 」と呼ばれます 。 したがって、アシスタント自身の音声アーキテクチャと機能を同時に設計できました。



私たちの仕事の結果は、オープンAPIと「 ハイブリッド 」NLPテクノロジーを備えたアプリケーションでした。これにより、サーバーなしで音声インターフェイスをプログラムでき、デバイスとAndroid SDKのみを使用して、一方で、ソリューションの一部を経由してクラウドに転送できます必要です。 たとえば、連絡先はどのサーバー(hello Siri)にも送信されず、たとえば、気象サービスが機能するすべての都市のリストはクライアントに保存されません。



すべてのアシスタントサービスは、ASR、TTS、またはNLPの分野で特別な知識を持たないプログラマーによって作成されました。 同時に、オープンでアクセスしやすく理解しやすいプラットフォームをすべての人に提供するというタスクを設定しているため、「アシスタント」のAPIを使用するのに特別な困難はありませんでした。



「ロシア語のアシスタント」は、Android OSのプロセス間通信 (IPC)の可能性を利用して、アシスタントがユーザーと自分のアプリケーション間の音声インターフェイスとして機能するようにします。 同時に、アプリケーションはアシスタントのインターフェイスにGUIを表示できます。このために、RemoteViewsおよび他の同様の手法が使用されます。



APIでできること



API「ロシア語のアシスタント」により、アシスタントの機能が動作するデバイスを超えて拡張される、より興味深いオプションを作成できます。 たとえば、サードパーティのアプリケーション「 AssistantConnect 」は、 アシスタントのAPIを使用して、「スマート」ホームおよびホームシアターのさまざまなデバイスの音声を制御できます。







同時に、「AssistantConnect」は、HTTPプロトコルを介してリクエストをXBMC映画館に、 ZWaveを Veraスマートホームコントローラーに送信できる通常のAndroidアプリケーションです。



また、同じアドオンを使用して、たとえば通常のブラウザを制御する方法を確認することもできます。 これらはすべて、ユーザーとの新しいタイプの通信を作成できるアシスタントAPIの機能を示しています。



APIを取得する方法



私たちのウェブサイトからダウンロードすることで、あなた自身のプロジェクトで今すぐAPIを試すことができます。 次に、使用方法の簡単な説明のみを示します。 次の記事では、「ロシア語でのアシスタント」プラットフォーム全体の実装の技術的な詳細を説明するとともに、API自体を使用することの微妙な点について説明します。



この記事は、アシスタントAPIを公開する最初のステップです。 近い将来、大きく変化します。PlayStoreで音声制御をサポートするすべてのアプリケーションを見つけることができるアドオンカタログ 、独自の音声アシスタントを作成するための商用SDKなど、より多くの機能を提供する予定です。



基本



アプリケーションにアシスタントAPIを使用してライブラリを実装するために、新しいプログラミング言語やテクノロジーを学ぶ必要はありません。 必要なのは、開発用のAndroid SDKとIDEだけです。 Android Studioを使用することをお勧めします 。 ライブラリは、 build.gradleファイルで依存関係を指定するだけで接続されます



repositories { maven { url 'http://voiceassistant.mobi/m2/repository' } } dependencies { compile 'mobi.voiceassistant:base:0.1.0-SNAPSHOT' compile 'mobi.voiceassistant:client:0.1.0-SNAPSHOT' }
      
      







APIを使用すると、アプリケーションと「ロシア語のアシスタント」との間に接続を確立し、アプリケーションに適したすべてのユーザーフレーズを、実装する必要がある特別なサービスにリダイレクトすることができます。 これらのサービスをエージェントと呼びます。



エージェントとモジュール



アシスタントは、フレーズのテキストから必要なすべてのデータを事前に抽出し、セマンティック解析ツリー-トークンの形式でエージェントに提供します。 これは、サービス用に作成する必要がある特別な文法(モジュール)によるものです。



モジュールは、エージェントが応答するフレーズのテンプレート(パターン)を持つコマンドのセットです(パターンの構文については、APIのドキュメントで詳細に説明されています)。 エージェントは、ユーザーが使用できるこのようなモジュールのセットをいつでも制限して、ダイアログコンテキストを形成できます。 簡単なモジュールの例を次に示します。



 <?xml version="1.0" encoding="utf-8"?> <module xmlns:android="http://schemas.android.com/apk/res/android"> <pattern name="UserName" value="*" /> <command android:id="@+id/cmd_hello"> <pattern value="* *"/> </command> <command android:id="@+id/cmd_name"> <pattern value="*   $UserName"/> </command> </module>
      
      







モジュールは、アプリケーションのxmlリソースディレクトリに保存する必要がある単なるxmlファイルです。 以下は、2つのコマンドと非常に単純なパターンを持つ単純なモジュールの例です。

ご覧のとおり、すべてのコードはエージェントのクラスで記述されるため、モジュールには制御コードが含まれていません。 これは、音声APIへのアプローチの基本原則を反映しています。 対話の文法を記述する宣言部は、処理ロジックを実装し、言語に完全に依存しない制御コードから分離されています



実際、エージェントは通常のAndroidサービスのアドオンです。 アシスタントとアプリケーションのロジック間のインターフェイスを実装します。



 public class HelloAgent extends AssistantAgent { @Override protected void onCommand(Request request) { switch (request.getDispatchId()) { case R.id.cmd_hello: onHello(request); break; case R.id.cmd_name: onName(request); break; } } ... }
      
      







モジュールで前述したコマンドをエージェントが処理する方法の簡単な例を次に示します。 AssistantAgent抽象化は、コマンドの処理、ダイアログコンテキストの管理、サードパーティのアクティビティの呼び出しなどのためのさまざまな方法を提供します。



リクエストには、ユーザーのリクエストに関するすべての必要な情報が含まれます-コマンドの識別子、リクエストの内容(トークンまたはその他)、セッションなど。 どんな要求に対しても、エージェントは応答を生成する必要があります。応答には、応答の内容と、必要に応じて、アシスタントがダイアログのコンテキストを切り替えるための指示が含まれます。



 request.addQuickResponse(“!”);
      
      







これは、1行で迅速な応答を形成する例です。 次に、もう少し複雑な例を示します。



 Response response = request.createResponse(); response.setContent(getString(R.string.hello_say_name)); response.enterModalQuestionScope(R.xml.name); request.addResponse(response);
      
      







ここでは、文字列形式のコンテンツ(GUIなどの他のタイプのコンテンツを転送できます)に加えて、ダイアログのコンテキストの変更に関する情報も含まれています。 これで、ユーザーはR.xml.nameモジュールからのみコマンドにアクセスでき、エージェントからのアシスタントの音声が応答すると、マイクが自動的にオンになります-これは「モーダルモード」と呼ばれます。



各エージェントはサービスであるため、アプリケーションマニフェスト-AndroidManifest.xmlで記述する必要があります



 <service android:name=".HelloAgent"> <intent-filter> <action android:name="mobi.voiceassistant.intent.action.COMMAND"/> <data android:scheme="assist" android:host="mobi.voiceassistant.ru"/> </intent-filter> <meta-data android:name="mobi.voiceassistant.MODULE" android:resource="@xml/hello"/> </service>
      
      







エージェントのメインモジュールと、エージェントが使用できる「ロシア語のアシスタント」のパッケージをここに示します。



アプリケーションをビルドして「ロシア語のアシスタント」デバイスにインストールすると、マニフェストから情報を取得してモジュールをロードします。 そして、アシスタントNLPエンジンがモジュールコマンドパターンでフレーズが最適であると判断した場合、ユーザーからの適切なリクエストをすべてエージェントにリダイレクトします。



続く



この投稿では、APIの使用の基本を非常に簡単に説明し、APIを操作する基本原則を説明しました。 もちろん、アシスタントライブラリには、リモートおよびファジーパターン、RemoteView、応答コンテンツの動的な変更、フレーズからのデータの抽出など、さらに多くの複雑な機能が用意されています。 これはすべてドキュメントに記載されており、ライブラリ自体の改善の過程で補足します。



自分のプロジェクトで音声制御を試して、開発者コミュニティに参加してこのツールの改善に協力することをお勧めします。



All Articles