Распознаватель речи сервисом WCF с клиентским приложением Xamarin для Android

Я хотел бы написать WCF Serwis, где я использую библиотеку Microsotf.Speech.Recognition, чтобы сделать сервис преобразования речи в текст. Вот мой сервисный код:

public class Rozpoznawacz : IRozpoznawacz
{
    public void AudioToText(Stream audioStr)
    {

        SpeechRecognitionEngine _sre = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("pl-PL"));

        // Create a simple grammar that recognizes the words
        Choices words = new Choices();

        // Add the words to be recognised
        words.Add("red");
        words.Add("green");
        words.Add("blue");
        words.Add("yellow");
        words.Add("orange");
        words.Add("Dzień dobry");
        words.Add("Chrząszcz");
        words.Add("Brzmi");
        words.Add("w");
        words.Add("trzcinie");
        words.Add("Wystaw fakturę");
        words.Add("Stefan Burczymucha");

        GrammarBuilder gb = new GrammarBuilder();
        gb.Culture = new System.Globalization.CultureInfo("pl-PL");
        gb.Append(words);

        // Create the actual Grammar instance, and then load it into the speech recognizer.
        Grammar g = new Grammar(gb);
        _sre.LoadGrammar(g);

        // Register a handler for the SpeechRecognized event.
        _sre.SpeechRecognized +=
            new EventHandler<SpeechRecognizedEventArgs>(sre_SpeechRecognized);
        //_sre.SetInputToDefaultAudioDevice();
        _sre.SetInputToWaveStream(audioStr);
        _sre.RecognizeAsync(RecognizeMode.Multiple);         
    }

    void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {         
        string rozpoznanie = "";
        rozpoznanie += e.Result.Text;

        using (StreamWriter outfile = new StreamWriter(@"C:\Test.txt"))
        {
            outfile.Write(rozpoznanie);
        }
    }



    public string Test(string query)
    {
        return string.Format("Przyjęto: {0}", query);
    }
}

Затем я попытался написать Android-приложение со ссылками на службы, я попытался записать голос и отправить его на хост WebService, но я не знаю, как мне отправить аудиофайл. Вот мой не работающий код в приложении для Android:

using System;

using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Media;
using System.IO;


namespace RozpoznawanieMowyZdalne.Adroid
{
    [Activity(Label = "RozpoznawanieMowyZdalne.Adroid", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        int count = 1;

        MediaRecorder recorder;
        MediaPlayer player;
        Button btnStart;
        Button btnStop;

        string path = "/sdcard/test.3gpp";

        private RozpoznawaczService.Rozpoznawacz client;
        private TextView aLabel;
        byte[] audioByte;

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

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            // Get our button from the layout resource,
            // and attach an event to it
            btnStart = FindViewById<Button>(Resource.Id.btnStart);
            btnStop = FindViewById<Button>(Resource.Id.btnStop);


            btnStart.Click += delegate
            {
                client.TestAsync("Android");

                btnStop.Enabled = !btnStop.Enabled;
                btnStart.Enabled = !btnStart.Enabled;

                recorder.SetAudioSource(AudioSource.VoiceRecognition);
                recorder.SetOutputFormat(OutputFormat.ThreeGpp);
                recorder.SetAudioEncoder(AudioEncoder.AmrNb);
                recorder.SetOutputFile(path);
                recorder.Prepare();
                recorder.Start();
                Toast.MakeText(this, "Rozpoczęto nagrywanie", ToastLength.Long).Show();
            };

            btnStop.Click += delegate
            {
                btnStop.Enabled = !btnStop.Enabled;

                recorder.Stop();
                Toast.MakeText(this, "Zakończono nagrywanie", ToastLength.Long).Show();
                recorder.Reset();

                player.SetDataSource(path);
                player.Prepare();
                player.Start();


                File.WriteAllBytes(path, audioByte);
                client.AudioToTextAsync(audioByte);
            };


            InitializeServiceClient();


        }

        protected override void OnResume()
        {
            base.OnResume();

            recorder = new MediaRecorder();
            player = new MediaPlayer();

            player.Completion += (sender, e) =>
            {
                player.Reset();
                btnStart.Enabled = !btnStart.Enabled;
            };

        }

        protected override void OnPause()
        {
            base.OnPause();

            player.Release();
            recorder.Release();
            player.Dispose();
            recorder.Dispose();
            player = null;
            recorder = null;
        }



        private void InitializeServiceClient()
        {
            client = new RozpoznawaczService.Rozpoznawacz();

            client.TestCompleted += client_TestCompleted;
            client.AudioToTextCompleted += client_AudioToTextCompleted;
            aLabel = FindViewById<TextView>(Resource.Id.textViewTest);
        }

        void client_AudioToTextCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            string msg = null;

            if (e.Error != null)
            {

                msg = e.Error.Message;

            }

            else if (e.Cancelled)
            {

                msg = "Request was cancelled.";

            }

            else
            {

                //msg = e.Result;

            }

            RunOnUiThread(() => aLabel.Text = "Wyslane");
        }

        void client_TestCompleted(object sender, RozpoznawaczService.TestCompletedEventArgs e)
        {
            string msg = null;

            if (e.Error != null)
            {

                msg = e.Error.Message;

            }

            else if (e.Cancelled)
            {

                msg = "Request was cancelled.";

            }

            else
            {

                msg = e.Result;

            }

            RunOnUiThread(() => aLabel.Text = msg);
        }
    }
}

Как я могу отправить свой аудиофайл на мой веб-сервис? PS. File.WriteAllBytes(path, audioByte); - это не работает в приложении Android...

0 ответов

Другие вопросы по тегам