音声認識Androidアプリケーションを作る ~Delphiソースコード集
1.フォームの作成
FMXフレームワークで以下のようなTButtonとTMemoを配置したフォームを作成します。2.ソースコード
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ScrollBox, FMX.Memo, FMX.Controls.Presentation, FMX.StdCtrls ,Androidapi.JNI.GraphicsContentViewText // TJIntent ,System.Messaging //TMessageManager TMessage ,Androidapi.JNI.speech ,Androidapi.JNI.JavaTypes; //JLocale JHashMap type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { private 宣言 } procedure HandleActivityMessage(const Sender: TObject; const M: TMessage); public { public 宣言 } end; var Form1: TForm1; const ReqSpeechCode:integer=1234; implementation {$R *.fmx} uses Androidapi.Helpers //StrintToJString ,Androidapi.JNI.App ; //TJActivity procedure TForm1.Button1Click(Sender: TObject); var intent: JIntent; lo:JLocale; MessageSubscriptionID: Integer; begin //ハンドラを登録 MessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage( TMessageResultNotification, HandleActivityMessage); //音声認識方法の種類 //利用者が話した音声を解析し、認識候補の単語をまとめて返してくれます intent := TJIntent.JavaClass.init( TJRecognizerIntent.JavaClass.ACTION_RECOGNIZE_SPEECH); //視覚的注意やタッチ入力なしでアクティビティを開始(APIレベル16以上) //intent := TJIntent.JavaClass.init( // TJRecognizerIntent.JavaClass.ACTION_VOICE_SEARCH_HANDS_FREE); //音声の認識結果のうち一つの単語を選択して Web 検索を行います //intent := TJIntent.JavaClass.init( // TJRecognizerIntent.JavaClass.ACTION_WEB_SEARCH); //音声認識の言語モデル設定 //WEBでよく使われる語を参考にして認識する intent.putExtra( TJRecognizerIntent.JavaClass.EXTRA_LANGUAGE_MODEL, TJRecognizerIntent.JavaClass.LANGUAGE_MODEL_WEB_SEARCH); //自由形式の音声認識に基づく言語モデルを使用します。 //intent.putExtra( // TJRecognizerIntent.JavaClass.EXTRA_LANGUAGE_MODEL, // TJRecognizerIntent.JavaClass.LANGUAGE_MODEL_FREE_FORM); //音声認識後の戻り値候補の最大数を設定(最大1個の候補値をもらう) intent.putExtra(TJRecognizerIntent.JavaClass.EXTRA_MAX_RESULTS, 1); //アクティビティで表示させるキャプションの設定 intent.putExtra(TJRecognizerIntent.JavaClass.EXTRA_PROMPT, StringToJString('話してください')); //デフォルトロケールの取得 lo := TJLocale.JavaClass.getDefault; //ロケールの設定 "ja_JP" intent.putExtra( TJRecognizerIntent.javaclass.EXTRA_LANGUAGE, lo.toString); //インテントとリクエストコードを渡して、アクティビティを呼び出す TAndroidHelper.Activity.startActivityForResult(intent, ReqSpeechCode); end; procedure TForm1.HandleActivityMessage(const Sender: TObject; const M: TMessage); var ReqCode, ResCode: Integer; Data: JIntent; ResArr:JArrayList; //i:Integer; begin if M is TMessageResultNotification then begin ReqCode:=TMessageResultNotification(M).RequestCode; ResCode:=TMessageResultNotification(M).ResultCode; Data:=TMessageResultNotification(M).Value; //アクティビティに渡したリクエストコードと、 //戻り値のリクエストコードが一致する場合は処理をする if ReqCode=ReqSpeechCode then begin if ResCode<>TJActivity.JavaClass.RESULT_OK then exit; if not Assigned(Data) then exit; ResArr:=Data.getStringArrayListExtra( TJRecognizerIntent.JavaClass.EXTRA_RESULTS ); //第1候補のみをMemo1に出力 Memo1.Lines.Add(JStringToString(ResArr.get(0).toString)); //すべての候補をMemo1に出力する場合 //for i := 0 to ResArr.Size-1 do // Memo1.Lines.Add(JStringToString(ResArr.get(i).toString)); end; end; end; end.