Mam's WebSite
Delphiでお手軽プログラミング

トップページ⇒Delphiで音声認識するAndroidアプリケーションを作る

Delphiで音声認識するAndroidアプリケーションを作る

~Delphiで音声認識アクティビティを呼び出して戻り値を表示するAndroidアプリケーションを作成します。



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);

  //音声認識をWEB検索設定にする
  intent.putExtra(
    TJRecognizerIntent.JavaClass.EXTRA_LANGUAGE_MODEL,
    TJRecognizerIntent.JavaClass.ACTION_WEB_SEARCH);


  //音声認識後の戻り値候補の最大数を設定(最大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.

3.実行画面

実行してButton1をタップして、話をすると、Memo1に話した文字列が表示されます。



Mam's WebSite