1
3

More than 3 years have passed since last update.

眺めて覚える C# Xamarin (5) 音声認識

Posted at

Androidの音声認識をプログラムしちゃおう!

image.png

新しいプロジェクトを選択

image.png

 モバイルアプリ(Xamarin forms)を選択 次へ

Android アプリでもできるけど例題がほとんどないモバイルアプリで作るね!

モバイルアプリのほうが何となくシンプルだから!

image.png

プロジェクト名は、シンプルにSpeech to TextをSp2Textにした。

image.png

今回は、MainPageとMainActivityにプログラムを追加して作っていきます。

MainPage.Xamlには、User Interfaceをコーディングします。
MainActivityには、Amdroidの本来持っている音声認識を呼び出すルーチンをコーディングします。
image.png

MainActivity.csを見てみましょう。

Xamarin.Forms.MessagingCenter.Subscribe(this, "StartVoice", StartVoice);は、MainPagからメッセージが送信されるとprivate void StartVoice(object o, string arg)を(音声認識)起動します。

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

namespace Sp2Text.Droid
{
    [Activity(Label = "Sp2Text", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        // 音声認識用定数定義
        private const int VOICE = 10;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
            //MainPageの開始ボタンか押された場合
            Xamarin.Forms.MessagingCenter.Subscribe<Object, string>(this, "StartVoice", StartVoice);
        }
        /// <summary>
        /// 音声認識の起動
        /// </summary>
        /// <param name="o"></param>
        /// <param name="arg"></param>
        private void StartVoice(object o, string arg)
        {
            var voiceIntent = new Intent(RecognizerIntent.ActionRecognizeSpeech);
            voiceIntent.PutExtra(RecognizerIntent.ExtraLanguageModel, RecognizerIntent.LanguageModelFreeForm);
            voiceIntent.PutExtra(RecognizerIntent.ExtraPrompt, "Speak Now :)");
            voiceIntent.PutExtra(RecognizerIntent.ExtraSpeechInputCompleteSilenceLengthMillis, 1500);
            voiceIntent.PutExtra(RecognizerIntent.ExtraSpeechInputPossiblyCompleteSilenceLengthMillis, 1500);
            voiceIntent.PutExtra(RecognizerIntent.ExtraSpeechInputMinimumLengthMillis, 15000);
            voiceIntent.PutExtra(RecognizerIntent.ExtraMaxResults, 1);
            voiceIntent.PutExtra(RecognizerIntent.ExtraLanguage, Java.Util.Locale.Default);
            StartActivityForResult(voiceIntent, VOICE);
        }
        /// <summary>
        /// 音声認識終了処理
        /// </summary>
        /// <param name="requestCode"></param>
        /// <param name="resultVal"></param>
        /// <param name="data"></param>
        protected override void OnActivityResult(int requestCode, Result resultVal, Intent data)
        {
            if (requestCode == VOICE)
            {
                if (resultVal == Result.Ok)
                {
                    var matches = data.GetStringArrayListExtra(RecognizerIntent.ExtraResults);
                    var txt = matches[0].ToString();
                    //音声認識テキストをMainPageに送る
                    Xamarin.Forms.MessagingCenter.Send<Object, string>(this, "EndOfVoice", txt);
                }
            }
            base.OnActivityResult(requestCode, resultVal, data);
        }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

UIのレイアウトは、次のように定義しまた。

MainPage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="Sp2Text.MainPage">

    <StackLayout>
        <StackLayout>
            <Button x:Name="btn" Text="音声認識開始"
                    FontSize="24"
                    Clicked="BtnClick"/>
            <Label x:Name="Lb" Text="音声認識結果" 
             FontSize="32"
           HorizontalOptions="Center"
           VerticalOptions="CenterAndExpand" />
        </StackLayout>
    </StackLayout>
</ContentPage>

image.png

MainPage.xaml.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace Sp2Text
{
    // Learn more about making custom code visible in the Xamarin.Forms previewer
    // by visiting https://aka.ms/xamarinforms-previewer
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            //音声認識の終了したメッセージを受け取る
            MessagingCenter.Subscribe<Object, string>(this, "EndOfVoice", EndOfVoice);
        }
        /// <summary>
        /// ボタンがクリックされたとき
        /// </summary>
        /// <param name="s"></param>
        /// <param name="e"></param>
        void BtnClick(object s, EventArgs e)
        {
            // 音声開始コマンドをMainActivityに送信
            MessagingCenter.Send<Object, string>(this, "StartVoice", "StartVoice");
        }
        /// <summary>
        /// 音声認識の終了
        /// </summary>
        /// <param name="o"></param>
        /// <param name="arg"></param>
        void EndOfVoice(object o, string arg)
        {
            Lb.Text = arg;
        }
    }
}

実行すると
image.png

Sourceは、ここ

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3