Azure konuşma hizmeti 'ni kullanarak konuşma tanıma

Örnek indir Örneği indirin

Azure konuşma hizmeti, aşağıdaki işlevleri sunan bulut tabanlı bir API 'dir:

  • Konuşmayı metne dönüştürme ses dosyalarını veya akışları metne.
  • Metin okuma , giriş metnini insan benzeri sentezleştirilmiş konuşmaya dönüştürür.
  • Konuşma çevirisi , hem konuşmayı metne dönüştürme hem de konuşma okuma için gerçek zamanlı, çok dilli çeviri sağlar.
  • Ses yardımcıları , uygulamalar için insan benzeri konuşma arabirimleri oluşturabilir.

Bu makalede Xamarin.Forms , Azure konuşma hizmeti kullanılarak, örnek uygulamada konuşmadan metne nasıl uygulandığı açıklanmaktadır. Aşağıdaki ekran görüntülerinde iOS ve Android 'de örnek uygulama gösterilmektedir:

İOSve Android 'de örnek uygulamanın iOS ve Android ekran görüntüleri üzerinde örnek uygulamanın ekran görüntüleri

Azure konuşma hizmeti kaynağı oluşturma

azure konuşma hizmeti, görüntü tanıma, konuşma tanıma ve çeviri ve Bing arama gibi görevler için bulut tabanlı apı 'ler sağlayan azure bilişsel hizmetler 'in bir parçasıdır. Daha fazla bilgi için bkz. Azure bilişsel hizmetler nedir?.

Örnek proje, Azure portal bir Azure bilişsel hizmetler kaynağı oluşturulmasını gerektirir. Bir bilişsel hizmetler kaynağı, konuşma hizmeti gibi tek bir hizmet veya çok hizmet olarak bir kaynak olarak oluşturulabilir. Konuşma hizmeti kaynağı oluşturma adımları aşağıdaki gibidir:

  1. Azure Portaloturum açın.
  2. Birden çok hizmet veya tek hizmet kaynağı oluşturun.
  3. Kaynağınızın API anahtarını ve bölge bilgilerini alın.
  4. Örnek sabitler. cs dosyasını güncelleştirin.

Kaynak oluşturmaya yönelik adım adım kılavuz için bkz. bilişsel Hizmetler kaynağı oluşturma.

Not

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun. Hesabınız olduğunda, ücretsiz katmanda hizmeti denemek için tek hizmet bir kaynak oluşturulabilir.

Konuşma hizmeti ile uygulamanızı yapılandırma

Bilişsel hizmetler kaynağı oluşturduktan sonra, sabitler. cs dosyası Azure kaynağından bölge ve API anahtarı ile güncelleştirilir:

public static class Constants
{
    public static string CognitiveServicesApiKey = "YOUR_KEY_GOES_HERE";
    public static string CognitiveServicesRegion = "westus";
}

NuGet konuşma hizmeti paketini yükler

örnek uygulama, Azure konuşma hizmetine bağlanmak için Microsoft. biliveservices. Speech NuGet paketini kullanır. bu NuGet paketini paylaşılan projeye ve her platform projesine yükler.

Imırophoneservice arabirimi oluşturma

Her platformun mikrofona erişmesi için izin gerekir. Örnek proje, IMicrophoneService paylaşılan projede bir arabirim sağlar ve Xamarin.FormsDependencyService arabiriminin platform uygulamalarını almak için öğesini kullanır.

public interface IMicrophoneService
{
    Task<bool> GetPermissionAsync();
    void OnRequestPermissionResult(bool isGranted);
}

Sayfa düzeni oluşturma

Örnek proje, MainPage. xaml dosyasında temel bir sayfa düzeni tanımlar. Anahtar düzen öğeleri Button , döküm işlemini başlatan, bir Label metni içeren bir metin ve döküm ActivityIndicator devam ederken gösterilecek bir işlemdir:

<ContentPage ...>
    <StackLayout>
        <Frame ...>
            <ScrollView x:Name="scroll"
                        ...>
                <Label x:Name="transcribedText"
                       ... />
            </ScrollView>
        </Frame>

        <ActivityIndicator x:Name="transcribingIndicator"
                           IsRunning="False" />
        <Button x:Name="transcribeButton"
                ...
                Clicked="TranscribeClicked"/>
    </StackLayout>
</ContentPage>

Konuşma hizmetini uygulama

MainPage. xaml. cs arka plan kod dosyası, ses gönderme ve Azure konuşma hizmetinden yeniden metin alma için tüm mantığı içerir.

MainPageOluşturucu, öğesinden bir arabirimin örneğini alır IMicrophoneServiceDependencyService :

public partial class MainPage : ContentPage
{
    SpeechRecognizer recognizer;
    IMicrophoneService micService;
    bool isTranscribing = false;

    public MainPage()
    {
        InitializeComponent();

        micService = DependencyService.Resolve<IMicrophoneService>();
    }

    // ...
}

TranscribeClickedYöntemi, transcribeButton örnek dokunulduğunda çağrılır:

async void TranscribeClicked(object sender, EventArgs e)
{
    bool isMicEnabled = await micService.GetPermissionAsync();

    // EARLY OUT: make sure mic is accessible
    if (!isMicEnabled)
    {
        UpdateTranscription("Please grant access to the microphone!");
        return;
    }

    // initialize speech recognizer 
    if (recognizer == null)
    {
        var config = SpeechConfig.FromSubscription(Constants.CognitiveServicesApiKey, Constants.CognitiveServicesRegion);
        recognizer = new SpeechRecognizer(config);
        recognizer.Recognized += (obj, args) =>
        {
            UpdateTranscription(args.Result.Text);
        };
    }

    // if already transcribing, stop speech recognizer
    if (isTranscribing)
    {
        try
        {
            await recognizer.StopContinuousRecognitionAsync();
        }
        catch(Exception ex)
        {
            UpdateTranscription(ex.Message);
        }
        isTranscribing = false;
    }

    // if not transcribing, start speech recognizer
    else
    {
        Device.BeginInvokeOnMainThread(() =>
        {
            InsertDateTimeRecord();
        });
        try
        {
            await recognizer.StartContinuousRecognitionAsync();
        }
        catch(Exception ex)
        {
            UpdateTranscription(ex.Message);
        }
        isTranscribing = true;
    }
    UpdateDisplayState();
}

TranscribeClickedYöntemi aşağıdakileri yapar:

  1. Uygulamanın mikrofona erişip erişemediğini denetler ve yoksa erken çıkar.
  2. Zaten mevcut değilse, sınıfının bir örneğini oluşturur SpeechRecognizer .
  3. Devam ediyorsa sürekli dökümü durduruyor.
  4. Bir zaman damgası ekler ve devam ederken sürekli dökümü başlatır.
  5. Uygulamanın görünümünü yeni uygulama durumuna göre güncelleştirmesini bildirir.

Sınıf yöntemlerinin geri kalanı MainPage uygulama durumunu görüntülemek için yardımcılardır:

void UpdateTranscription(string newText)
{
    Device.BeginInvokeOnMainThread(() =>
    {
        if (!string.IsNullOrWhiteSpace(newText))
        {
            transcribedText.Text += $"{newText}\n";
        }
    });
}

void InsertDateTimeRecord()
{
    var msg = $"=================\n{DateTime.Now.ToString()}\n=================";
    UpdateTranscription(msg);
}

void UpdateDisplayState()
{
    Device.BeginInvokeOnMainThread(() =>
    {
        if (isTranscribing)
        {
            transcribeButton.Text = "Stop";
            transcribeButton.BackgroundColor = Color.Red;
            transcribingIndicator.IsRunning = true;
        }
        else
        {
            transcribeButton.Text = "Transcribe";
            transcribeButton.BackgroundColor = Color.Green;
            transcribingIndicator.IsRunning = false;
        }
    });
}

UpdateTranscriptionYöntemi, newTextstringLabel adlı öğesine belirtilen öğesini Yazar transcribedText . Bu güncelleştirme, Kullanıcı arabirimi iş parçacığında, özel durumlara neden olmadan herhangi bir içerikten çağrılabilmesi için gerçekleşmesini zorlar. InsertDateTimeRecordtranscribedText Yeni bir döküm başlangıcını işaretlemek için örneğe geçerli tarih ve saati yazar. Son olarak UpdateDisplayState Yöntem, Button ve öğelerini, ActivityIndicator devam ediyor olup olmadığını yansıtacak şekilde güncelleştirir.

Platform mikrofon hizmetleri oluşturma

Uygulamanın konuşma verilerini toplamak için mikrofon erişimi olmalıdır. IMicrophoneServiceUygulamanın çalışması için arabirimin her platformda uygulanmış ve kayıtlı olması gerekir DependencyService .

Android

Örnek proje, IMicrophoneService adlı Android için bir uygulama tanımlar AndroidMicrophoneService :

[assembly: Dependency(typeof(AndroidMicrophoneService))]
namespace CognitiveSpeechService.Droid.Services
{
    public class AndroidMicrophoneService : IMicrophoneService
    {
        public const int RecordAudioPermissionCode = 1;
        private TaskCompletionSource<bool> tcsPermissions;
        string[] permissions = new string[] { Manifest.Permission.RecordAudio };

        public Task<bool> GetPermissionAsync()
        {
            tcsPermissions = new TaskCompletionSource<bool>();

            if ((int)Build.VERSION.SdkInt < 23)
            {
                tcsPermissions.TrySetResult(true);
            }
            else
            {
                var currentActivity = MainActivity.Instance;
                if (ActivityCompat.CheckSelfPermission(currentActivity, Manifest.Permission.RecordAudio) != (int)Permission.Granted)
                {
                    RequestMicPermissions();
                }
                else
                {
                    tcsPermissions.TrySetResult(true);
                }

            }

            return tcsPermissions.Task;
        }

        public void OnRequestPermissionResult(bool isGranted)
        {
            tcsPermissions.TrySetResult(isGranted);
        }

        void RequestMicPermissions()
        {
            if (ActivityCompat.ShouldShowRequestPermissionRationale(MainActivity.Instance, Manifest.Permission.RecordAudio))
            {
                Snackbar.Make(MainActivity.Instance.FindViewById(Android.Resource.Id.Content),
                        "Microphone permissions are required for speech transcription!",
                        Snackbar.LengthIndefinite)
                        .SetAction("Ok", v =>
                        {
                            ((Activity)MainActivity.Instance).RequestPermissions(permissions, RecordAudioPermissionCode);
                        })
                        .Show();
            }
            else
            {
                ActivityCompat.RequestPermissions((Activity)MainActivity.Instance, permissions, RecordAudioPermissionCode);
            }
        }
    }
}

, AndroidMicrophoneService Aşağıdaki özelliklere sahiptir:

  1. DependencyÖzniteliği, sınıfını öğesine kaydeder DependencyService .
  2. GetPermissionAsyncYöntemi Android SDK sürümüne göre izinlerin gerekli olup olmadığını denetler ve RequestMicPermissions izin verilmediğini çağırır.
  3. RequestMicPermissionsYöntemi, Snackbar bir korvaale gerekliyse kullanıcıdan izin istemek için sınıfını kullanır, aksi takdirde doğrudan ses kayıt izinleri ister.
  4. OnRequestPermissionResultbool Kullanıcı izin isteğine yanıt verdiğinde Yöntem bir sonuçla çağrılır.

MainActivitySınıf, AndroidMicrophoneService izin istekleri tamamlandığında örneği güncelleştirmek için özelleştirilir:

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    IMicrophoneService micService;
    internal static MainActivity Instance { get; private set; }
    
    protected override void OnCreate(Bundle savedInstanceState)
    {
        Instance = this;
        // ...
        micService = DependencyService.Resolve<IMicrophoneService>();
    }
    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
        // ...
        switch(requestCode)
        {
            case AndroidMicrophoneService.RecordAudioPermissionCode:
                if (grantResults[0] == Permission.Granted)
                {
                    micService.OnRequestPermissionResult(true);
                }
                else
                {
                    micService.OnRequestPermissionResult(false);
                }
                break;
        }
    }
}

MainActivitySınıfı Instance , AndroidMicrophoneService izinleri istenirken nesnesi için gerekli olan adlı statik bir başvuruyu tanımlar. OnRequestPermissionsResultAndroidMicrophoneService İzin isteği Kullanıcı tarafından onaylandığında veya reddedildiğinde nesneyi güncelleştirmek için yöntemini geçersiz kılar.

Son olarak, Android uygulaması AndroidManifest.xml dosyasına ses kaydetme iznini içermelidir:

<manifest ...>
    ...
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
</manifest>

iOS

Örnek proje, IMicrophoneService adlı iOS için bir uygulama tanımlar iOSMicrophoneService :

[assembly: Dependency(typeof(iOSMicrophoneService))]
namespace CognitiveSpeechService.iOS.Services
{
    public class iOSMicrophoneService : IMicrophoneService
    {
        TaskCompletionSource<bool> tcsPermissions;

        public Task<bool> GetPermissionAsync()
        {
            tcsPermissions = new TaskCompletionSource<bool>();
            RequestMicPermission();
            return tcsPermissions.Task;
        }

        public void OnRequestPermissionResult(bool isGranted)
        {
            tcsPermissions.TrySetResult(isGranted);
        }

        void RequestMicPermission()
        {
            var session = AVAudioSession.SharedInstance();
            session.RequestRecordPermission((granted) =>
            {
                tcsPermissions.TrySetResult(granted);
            });
        }
    }
}

, iOSMicrophoneService Aşağıdaki özelliklere sahiptir:

  1. DependencyÖzniteliği, sınıfını öğesine kaydeder DependencyService .
  2. GetPermissionAsyncYöntemi, RequestMicPermissions cihaz kullanıcıdan izin istemek için çağırır.
  3. RequestMicPermissionsYöntemi, AVAudioSession kayıt izinleri istemek için paylaşılan örneği kullanır.
  4. OnRequestPermissionResultYöntemi, TaskCompletionSource örneği belirtilen bool değerle güncelleştirir.

Son olarak, iOS uygulama bilgileri. plist , kullanıcıya uygulamanın mikrofona neden erişim istediğini bildiren bir ileti içermelidir. Info. plist dosyasını öğesi içine aşağıdaki etiketleri içerecek şekilde düzenleyin <dict> :

<plist>
    <dict>
        ...
        <key>NSMicrophoneUsageDescription</key>
        <string>Voice transcription requires microphone access</string>
    </dict>
</plist>

UWP

Örnek proje, IMicrophoneService UWP adlı bir uygulama tanımlar UWPMicrophoneService :

[assembly: Dependency(typeof(UWPMicrophoneService))]
namespace CognitiveSpeechService.UWP.Services
{
    public class UWPMicrophoneService : IMicrophoneService
    {
        public async Task<bool> GetPermissionAsync()
        {
            bool isMicAvailable = true;
            try
            {
                var mediaCapture = new MediaCapture();
                var settings = new MediaCaptureInitializationSettings();
                settings.StreamingCaptureMode = StreamingCaptureMode.Audio;
                await mediaCapture.InitializeAsync(settings);
            }
            catch(Exception ex)
            {
                isMicAvailable = false;
            }

            if(!isMicAvailable)
            {
                await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-microphone"));
            }

            return isMicAvailable;
        }

        public void OnRequestPermissionResult(bool isGranted)
        {
            // intentionally does nothing
        }
    }
}

, UWPMicrophoneService Aşağıdaki özelliklere sahiptir:

  1. DependencyÖzniteliği, sınıfını öğesine kaydeder DependencyService .
  2. GetPermissionAsyncYöntemi bir örneği başlatmaya çalışır MediaCapture . Başarısız olursa, mikrofonu etkinleştirmek için bir Kullanıcı isteği başlatır.
  3. OnRequestPermissionResultYöntemi, arabirimini karşılamak için vardır ancak UWP uygulamasında gerekli değildir.

Son olarak, UWP paketi. appxmanifest uygulamanın mikrofonu kullandığını belirtmesi gerekir. Package. appxmanifest dosyasını çift tıklatın ve Visual Studio 2019 ' deki yetenekler sekmesinde mikrofon seçeneğini belirleyin:

Visual Studio 2019 ' de bildirimin Visual Studio 2019 ekran görüntüsünde bildirim ekran görüntüsü

Uygulamayı test edin

Uygulamayı çalıştırın ve sonra da bu düğmeye tıklayın . Uygulamanın mikrofon erişimi istemesi ve döküm işlemine başlaması gerekir. , ActivityIndicator Bu döküm etkin olduğunu gösterecek şekilde canlandırır. Konuşurken, uygulama, Azure konuşma Hizmetleri kaynağına ses verileri akışı sağlar ve bu da birlikte bulunan metinle yanıt verir. Bu metin, Label alındığı gibi öğede görüntülenir.

Not

Android öykünücüleri konuşma hizmeti kitaplıklarını yükleyemez ve başlatamıyor. Android platformu için fiziksel bir cihazda test edilmesi önerilir.