Mam's WebSite

Mamの覚書Q&A検索


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

「 Androidで音声認識 」

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


回答

android.speech.SpeechRecognizer.pas
が必要。
マルチデバイスアプリケーションを作成し、フォームにボタンとメモをドラッグ&ドロップします。
以下ソースコードを入力し、ターゲットをAndroidにして実行します。
ボタンを押すと音声認識が表示されるので話します。
認識されるとメモに音声認識された文字列が表示されます。
認識候補が複数あっても1つ目の認識結果(つまり一番認識結果が正確だと思われるもの)をメモに表示します。

ソース

unit URecognizer;
 
interface
 
uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs
  , FMX.Controls.Presentation, FMX.StdCtrls  , FMX.ScrollBox, FMX.Memo
  ,Androidapi.Helpers //StrintToJString
  ,Androidapi.JNI.GraphicsContentViewText // TJIntent
  ,Androidapi.JNI.JavaTypes //JLocale
  ,System.Messaging //TMessageManager
  ,Androidapi.JNI.App // TJActivity
  ,android.speech.SpeechRecognizer;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { private 宣言 }
    FMessageSubscriptionID: 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=1234;
 
implementation
 
{$R *.fmx}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  intent: JIntent;
  lo:JLocale;
begin
  FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage
    (TMessageResultNotification, HandleActivityMessage);
  intent := TJIntent.JavaClass.init(StringToJString('android.speech.action.RECOGNIZE_SPEECH'));
  intent.putExtra(StringToJString('android.speech.extra.PROMPT'), StringToJString('begin'));
  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.PROMPT'),StringToJString('話して'));
  lo := TJLocale.JavaClass.getDefault;
  intent.putExtra(StringToJString('android.speech.extra.LANGUAGE'), lo.toString);  //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,
    FMessageSubscriptionID);
  FMessageSubscriptionID := 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;
 
end.

Copyright 2019 Mam