Xamarin.Android에서 간단한 음성 인식 샘플

마침내 무거운 허리를 들고 Xamarin을 시작했습니다.
Xamarin.Forms 사용하지 않으면 Xamarin 할 의미가 없다는 목소리도 들리지만
우선, 초보자로서는 Xamarin.Android에서 음성 인식 사용하는 샘플로부터 시작해 보겠습니다.

고전 한 것으로, Android 측의 음성 인식은 곧 움직여 주었습니다만,
OnActivityResult에서 결과를받을 수 없습니다. . .

다음 줄을 삽입하여 해결했습니다.public event EventHandler<PreferenceManager.ActivityResultEventArgs> ActivityResult = delegate { };이게 뭐야? ?
ActivityResult를 빈 메서드로 만드는 것 같습니다.
아시는 분 코멘트 기다리고 있습니다. . .

이하, 상세합니다.

개발 환경



우선 개발 환경입니다.

OS: Windows10
IDE: VisualStudio2017
Xamarin: 4.8
Xamarin.Android SDK: 8.1.0.24

참고원



아래의 기사를 참고로 하고 있습니다.
【Xamarin.Forms】 음성 인식 사용법
h tps:// 퀵했다. 소 m/미c 로와베 PC/있어 MS/40b1016cf84 에어 89C4 그림 d1

우이



UI 쪽은 TextView와 Button 1개씩의 간단한 것


소스 코드



Main.axml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/relativeLayout1"
        android:background="#545454">
        <TextView
            android:text="This is sample of Speech Recognize."
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/txt1"
            android:layout_marginLeft="10dp"
            android:textStyle="bold"
            android:textColor="@android:color/white"
            android:layout_marginTop="10dp"
            android:layout_centerHorizontal="true" />
        <Button
            android:text="Start"
            android:id="@+id/btn1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:width="165dp"
            android:layout_below="@id/txt1"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp"
            android:layout_centerHorizontal="true" />
    </RelativeLayout>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/txt2" />
</LinearLayout>

MainActivity.cs
using System;
using Android.App;
using Android.Widget;
using Android.Content;
using Android.OS;
using Android.Speech;

using Android.Preferences;

namespace App1
{
    [Activity(Label = "Speech Recognize Sample App", MainLauncher = true)]
    public class MainActivity : Activity
    {
        #region Constant, MainActivity

        // 定数・MainActivity
        private readonly int REQUEST_CODE_VOICE = 10;       // 音声認識のリクエストコード
        private readonly int INTERVAL_1500_MILLISEC = 1500; // 1.5秒(ミリ秒単位)

        #endregion

        public event EventHandler<PreferenceManager.ActivityResultEventArgs> ActivityResult = delegate { };

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
            Button button1 = FindViewById<Button>(Resource.Id.btn1);

            button1.Click += Button_Click;
        }

        private void Button_Click(object sender, System.EventArgs e)
        {
            Toast.MakeText(this, "speech recognize started.", ToastLength.Short).Show(); // トースト表示

            try
            {
                // 音声認識のアクティビティを呼び出すためのインテントを用意する。
                var voiceIntent = new Intent(RecognizerIntent.ActionRecognizeSpeech);

                // 諸々のプロパティを設定する。
                voiceIntent.PutExtra(RecognizerIntent.ExtraLanguageModel, RecognizerIntent.LanguageModelFreeForm);
                voiceIntent.PutExtra(RecognizerIntent.ExtraPrompt, "Speak to me!");
                voiceIntent.PutExtra(RecognizerIntent.ExtraSpeechInputCompleteSilenceLengthMillis, INTERVAL_1500_MILLISEC);
                voiceIntent.PutExtra(RecognizerIntent.ExtraSpeechInputPossiblyCompleteSilenceLengthMillis, INTERVAL_1500_MILLISEC);
                voiceIntent.PutExtra(RecognizerIntent.ExtraSpeechInputMinimumLengthMillis, INTERVAL_1500_MILLISEC);
                voiceIntent.PutExtra(RecognizerIntent.ExtraMaxResults, 1);

                // 認識言語の指定。端末の設定言語(Java.Util.Locale.Default)で音声認識を行う。
                voiceIntent.PutExtra(RecognizerIntent.ExtraLanguage, Java.Util.Locale.Default);

                // 音声認識のアクティビティを開始する。
                StartActivityForResult(voiceIntent, REQUEST_CODE_VOICE);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        // 音声認識のアクティビティで取得した結果をハンドルする処理の本体
        protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);

            if (requestCode == REQUEST_CODE_VOICE)
            {
                if (resultCode == Result.Ok)
                {
                    // 認識が成功した場合、認識結果の文字列を引き出し、RecognizedTextに入れる。
                    var matches = data.GetStringArrayListExtra(RecognizerIntent.ExtraResults);
                    if (matches.Count != 0)
                    {
                        FindViewById<TextView>(Resource.Id.txt2).Text += matches[0] + "\n";
                    }
                }
            }
        }
    }
}

좋은 웹페이지 즐겨찾기