音声認識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に話した文字列が表示されます。