Mam's WebSite
建築CGパース住宅CGパース

Mamの覚書Q&A検索

トップページMamの覚書Q&A検索Delphi(FMX_Android)⇒Q&A


大項目:「 Delphi 」 - 中項目:「 FMX_Android 」

「 Androidの音声認識を使いたい 」

DelphiでAndroidの音声認識を使ったプログラムを作りたい


回答

android.speech.action.RECOGNIZE_SPEECH
を使えば可能です。
SharedActivityのstartActivityForResultを使って結果を貰います。
戻ってきた結果はgetStringArrayListExtraで結果リストを貰います。
intent.putExtra(StringToJString('android.speech.extra.MAX_RESULTS'),1);
と指示をしているので結果は1つですが、それでもリストで結果を貰います。
以下のソースコードを参考にしてください。

ソース

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { private 宣言 }
    FmsID:Integer;
    procedure HandleActivityMessage(const Sender:TObject;const M:TMessage);
    function OnActivityResult(RequestCode,ResultCode:Integer;Data:JIntent):Boolean;
  public
    { public 宣言 }
  end;
var
  Form1: TForm1;
const speechCode:Integer=2000;
 
implementation
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
var intent:JIntent;
begin
  FmsID:=
    TmessageManager.DefaultManager.SubscribeToMessage(
      TMessageResultNotification,HandleActivityMessage
    );
  intent:=TJIntent.JavaClass.init(
    StringToJString('android.speech.action.RECOGNIZE_SPEECH')
  );
  intent.putExtra(
    StringToJString('android.speech.extra.PROMPT'),
    StringToJString('話して')
  );
  intent.putExtra(
    StringToJString('android.speech.extra.LANGUAGE_MODEL'),
    StringToJString('web_search')
  );
  intent.putExtra(
    StringToJString('android.speech.extra.MAX_RESULTS'),1
  );
  intent.putExtra(
    StringToJString('android.speech.extra.LANGUAGE'),
    StringToJString('ja_JP')
  );
  SharedActivity.startActivityForResult(intent,speechCode);
end;
 
procedure TForm1.HandleActivityMessage(const Sender: TObject;
  const M: TMessage);
begin
  if M is TMessageResultNotification then
  begin
    OnActivityResult(
      TMessageResultNotification(M).RequestCode,
      TMessageResultNotification(M).ResultCode,
      TMessageResultNotification(M).Value
    );
  end;
end;
 
function TForm1.OnActivityResult(RequestCode, ResultCode: Integer;
  Data: JIntent): Boolean;
var ret:JArrayList;
begin
  TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification,FmsID);
  FmsID:=0;
  if RequestCode<>speechCode then exit(false);
  result:=True;
  if ResultCode<>TJActivity.JavaClass.RESULT_OK then exit;
  if not Assigned(Data) then exit;
  ret:=Data.getStringArrayListExtra(
    StringToJString('android.speech.extra.RESULTS')
  );
  memo1.Lines.Add(JStringToString(ret.get(0).toString));
end;


Mam's WebSite