トップへ(mam-mam.net/)

音声認識Androidアプリケーションを作る ~Delphiソースコード集

検索:

音声認識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.

3.実行画面

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