Xamarin.iOS'ta Konuşma Tanıma

Bu makale yeni Konuşma API'sini sunar ve sürekli konuşma tanımayı desteklemek ve konuşmayı metne (canlı veya kayıtlı ses akışlarından) dönüştürecek şekilde bir Xamarin.iOS uygulamasında nasıl uygulandığını gösterir.

iOS 10'da yeni olan Apple, bir iOS uygulamasının sürekli konuşma tanımayı desteklemesine ve konuşmayı (canlı veya kayıtlı ses akışlarından) metne dönüştüren Konuşma Tanıma API'sini piyasaya sürüyor.

Apple'a göre Konuşma Tanıma API'si aşağıdaki özelliklere ve avantajlara sahiptir:

  • Yüksek Oranda Doğru
  • State of the Art
  • Kullanımı Kolay
  • Hızlı
  • Birden Çok Dili Destekler
  • Kullanıcı Gizliliğine Saygı Duyar

Konuşma Tanıma Nasıl Çalışır?

Konuşma Tanıma, canlı veya önceden kaydedilmiş ses (API'nin desteklediği konuşma dillerinin herhangi birsında) edinilerek ve konuşmanın düz metin transkripsiyonu döndüren bir Konuşma Tanıma'ya geçirerek bir iOS uygulamasında uygulanır.

Konuşma Tanıma Nasıl Çalışır?

Klavye Diktesi

Kullanıcıların çoğu bir iOS cihazında Konuşma Tanıma'ya karar verdiklerinden, iOS 5'te iPhone 4S ile birlikte Klavye Diktesi ile birlikte yayımlanan yerleşik Siri ses yardımcısını düşünebilirsiniz.

Klavye Diktesi, TextKit'i (veya gibi) destekleyen herhangi bir arabirim öğesi tarafından de destekler ve iOS sanal klavyesinde UITextField Dictation Düğmesine (doğrudan ara çubuğun sol tarafından) tıklar ve kullanıcı tarafından UITextArea etkinleştirilir.

Apple aşağıdaki Klavye Dikte istatistiklerini (2011'den beri toplanır) yayımlar:

  • Klavye Diktesi, iOS 5'te yayımlandı.
  • Günde yaklaşık 65.000 uygulama bunu kullanır.
  • iOS Diktesi'nin yaklaşık üçte biri 3. taraf bir uygulamada yapılır.

Klavye Diktesi son derece kolaydır çünkü uygulamanın kullanıcı arabirimi tasarımında TextKit arabirim öğesi kullanmak dışında geliştiricinin herhangi bir çabası yoktur. Klavye Dikte özelliği, kullanılamadan önce uygulamanın özel ayrıcalık isteklerini gerektirmemesi avantajına da sahiptir.

Konuşma tanıma, Apple'ın sunucularında verilerin iletimini ve geçici olarak depolanması gerektirdiği için yeni Konuşma Tanıma API'lerini kullanan uygulamalara kullanıcı tarafından özel izinler verilmesi gerekir. Ayrıntılar için lütfen Güvenlik ve Gizlilik Geliştirmeleri belgelerimize bakın.

Klavye Diktesi kolayca uygulansa da çeşitli sınırlamalar ve dezavantajlarla birlikte gelir:

  • Metin Girişi Alanı'nın ve klavyenin güncelleştirmesi gerekir.
  • Yalnızca canlı ses girişiyle çalışır ve uygulamanın ses kayıt işlemi üzerinde denetimi yoktur.
  • Kullanıcının konuşmasını yorumlamak için kullanılan dil üzerinde denetim sağlar.
  • Uygulamanın Dictation düğmesinin kullanıcı tarafından kullanılabilir olup olmadığını bile bilmesi için bir yol yoktur.
  • Uygulama, ses kayıt işlemini özelleştiramaz.
  • Zamanlama ve güven gibi bilgilerden eksik olan çok basit bir sonuç kümesi sağlar.

Konuşma Tanıma API'si

iOS 10'da yeni olan Apple, bir iOS uygulamasının konuşma tanımayı uygulaması için daha güçlü bir yol sağlayan Konuşma Tanıma API'sini piyasaya sürüyor. Bu API, Apple'ın hem Siri'yi hem de Klavye Diktesini sağlamak için kullandığı API ile aynıdır ve son teknoloji doğruluğuyla hızlı transkripsiyon sağlama özelliğine sahiptir.

Konuşma Tanıma API'si tarafından sağlanan sonuçlar, uygulamanın herhangi bir özel kullanıcı verisi toplaması veya erişmesi gerekmeden tek tek kullanıcılara saydam bir şekilde özelleştirilebilir.

Konuşma Tanıma API'si, kullanıcı konuşma sırasında arama uygulamasına neredeyse gerçek zamanlı sonuçlar sağlar ve yalnızca metinden çok çeviri sonuçları hakkında daha fazla bilgi sağlar. Bu modüller şunlardır:

  • Kullanıcının ne demek istediğinin birden çok yorumu.
  • Bireysel çeviriler için güven düzeyleri.
  • Zamanlama bilgileri.

Yukarıda belirtildiği gibi, çeviri için ses canlı akış veya önceden kaydedilmiş bir kaynaktan ve iOS 10 tarafından desteklenen 50'den fazla dilden ve diyalektlerden herhangi biri tarafından sağlanmalıdır.

Konuşma Tanıma API'si iOS 10 çalıştıran tüm iOS cihazlarında kullanılabilir ve çoğu durumda çevirilerin büyük bir kısmının Apple sunucularında olması için canlı bir internet bağlantısı gerekir. Ancak, bazı yeni iOS cihazları belirli dillerin her zaman açık, cihaz üzerinde çevirisini destekler.

Apple, belirli bir dilin şu anda çeviri için kullanılabilir olup olmadığını belirlemek için bir Kullanılabilirlik API'si dahil etti. Uygulamanın doğrudan İnternet bağlantısını test etmek yerine bu API'yi kullanması gerekir.

Yukarıda Klavye Diktesi bölümünde belirtildiği gibi konuşma tanıma, Apple'ın sunucularında verilerin internet üzerinden iletimini ve geçici olarak depolanmasını gerektirir ve bu nedenle uygulamanın, anahtarı dosyasına dahil etmek ve yöntemini çağırarak kullanıcının tanıma gerçekleştirme iznini talep etmek zorunda olması Info.plistSFSpeechRecognizer.RequestAuthorization gerekir.

Konuşma Tanıma için kullanılan ses kaynağına bağlı olarak, uygulamanın dosyasında başka Info.plist değişiklikler gerekebilir. Ayrıntılar için lütfen Güvenlik ve Gizlilik Geliştirmeleri belgelerimize bakın.

Uygulamada Konuşma Tanımayı Benimseme

Geliştiricinin bir iOS uygulamasında konuşma tanımayı benimsemesi için atılması gereken dört önemli adım var:

  • anahtarını kullanarak uygulamanın dosyasında bir Info.plist kullanım açıklaması NSSpeechRecognitionUsageDescription girin. Örneğin, bir kamera uygulaması şu açıklamayı içerebilir: "Bu, yalnızca 'peynir' sözcüğüyle fotoğraf çekebilirsiniz."
  • Uygulamanın bir iletişim kutusunda kullanıcıya neden konuşma tanıma erişimi istediğini ve kabul etmelerine veya reddetmesine izin vermek için yöntemini çağırarak yetkilendirme isteğinde bulundurun (yukarıdaki anahtarda SFSpeechRecognizer.RequestAuthorizationNSSpeechRecognitionUsageDescription verilmektedir).
  • Konuşma Tanıma İsteği oluşturma:
    • Diskte önceden kaydedilmiş ses için sınıfını SFSpeechURLRecognitionRequest kullanın.
    • Canlı ses (veya bellekten gelen ses) için sınıfını SFSPeechAudioBufferRecognitionRequest kullanın.
  • Tanımaya başlamak için Konuşma Tanıma İsteği'ne Bir Konuşma Tanıma ( SFSpeechRecognizer ) iletir. Uygulama, isteğe bağlı olarak, tanıma sonuçlarını SFSpeechRecognitionTask izlemek ve izlemek için döndürülen üzerinde tutabilir.

Bu adımlar aşağıda ayrıntılı olarak ele verilmiştir.

Kullanım Açıklaması Sağlama

Dosyasında gerekli NSSpeechRecognitionUsageDescription anahtarı sağlamak Info.plist için şunları yapın:

  1. Dosyayı düzenlemek için Info.plist açmak için çift tıklayın.

  2. Kaynak görünümüne geçiş:

    Kaynak görünümü

  3. Yeni Giriş Ekle'yetıklayın, Özellik için yazın,Tür için de Değer olarak bir Kullanım Açıklaması girin. Örnek:

    NSSperecRecognitionUsageDescription ekleme

  4. Uygulama canlı ses transkripsiyonunu işleyecekse Mikrofon Kullanımı Açıklaması da gerekir. Yeni Giriş Ekle'yetıklayın, Özellik için yazın,Tür için de Değer olarak bir Kullanım Açıklaması girin. Örnek:

    NSMicrophoneUsageDescription ekleme

  5. Dosyadaki değişiklikleri kaydedin.

Önemli

Yukarıdaki anahtarlardan ( veya ) herhangi biri sağlanmaz, canlı ses için Konuşma Tanıma'ya veya mikrofona erişmeye çalışırken uygulamanın uyarı olmadan Info.plistNSSpeechRecognitionUsageDescription başarısız olmaya neden NSMicrophoneUsageDescription olabilir.

Yetkilendirme İsteği

Uygulamanın konuşma tanımaya erişmesi için gerekli kullanıcı yetkilendirmeyi talep etmek için ana Görünüm Denetleyicisi sınıfını düzenleyin ve aşağıdaki kodu ekleyin:

using System;
using UIKit;
using Speech;

namespace MonkeyTalk
{
    public partial class ViewController : UIViewController
    {
        protected ViewController (IntPtr handle) : base (handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }

        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Request user authorization
            SFSpeechRecognizer.RequestAuthorization ((SFSpeechRecognizerAuthorizationStatus status) => {
                // Take action based on status
                switch (status) {
                case SFSpeechRecognizerAuthorizationStatus.Authorized:
                    // User has approved speech recognition
                    ...
                    break;
                case SFSpeechRecognizerAuthorizationStatus.Denied:
                    // User has declined speech recognition
                    ...
                    break;
                case SFSpeechRecognizerAuthorizationStatus.NotDetermined:
                    // Waiting on approval
                    ...
                    break;
                case SFSpeechRecognizerAuthorizationStatus.Restricted:
                    // The device is not permitted
                    ...
                    break;
                }
            });
        }
    }
}

sınıfının yöntemi, geliştiricinin dosya anahtarında sağladığı nedeni kullanarak konuşma tanımaya RequestAuthorizationSFSpeechRecognizer erişmek için NSSpeechRecognitionUsageDescription kullanıcıdan izin Info.plist isteğinde bulunacak.

Sonuç, kullanıcının iznine göre işlem yapmak için kullanılan SFSpeechRecognizerAuthorizationStatusRequestAuthorization yöntemin geri çağırma yordamına döndürülür.

Önemli

Apple, kullanıcı uygulamada bu izni talepmeden önce konuşma tanıma gerektiren bir eylem başlatana kadar beklemeyi önerir.

Önceden Kaydedilmiş Konuşmayı Tanıma

Uygulama önceden kaydedilmiş bir WAV veya MP3 dosyasından gelen konuşmayı tanımak istiyorsa aşağıdaki kodu kullanabilir:

using System;
using UIKit;
using Speech;
using Foundation;
...

public void RecognizeFile (NSUrl url)
{
    // Access new recognizer
    var recognizer = new SFSpeechRecognizer ();

    // Is the default language supported?
    if (recognizer == null) {
        // No, return to caller
        return;
    }

    // Is recognition available?
    if (!recognizer.Available) {
        // No, return to caller
        return;
    }

    // Create recognition task and start recognition
    var request = new SFSpeechUrlRecognitionRequest (url);
    recognizer.GetRecognitionTask (request, (SFSpeechRecognitionResult result, NSError err) => {
        // Was there an error?
        if (err != null) {
            // Handle error
            ...
        } else {
            // Is this the final translation?
            if (result.Final) {
                Console.WriteLine ("You said, \"{0}\".", result.BestTranscription.FormattedString);
            }
        }
    });
}

Bu koda ayrıntılı olarak bakarak öncelikle bir Konuşma Tanıma () oluşturma girişiminde SFSpeechRecognizer bulunmaktadır. Konuşma tanıma için varsayılan dil desteklenmiyorsa döndürülür null ve işlevlerden çıkar.

Konuşma Tanıma özelliği varsayılan dil için kullanılabilirse, uygulama şu anda özelliğini kullanarak tanıma için kullanılabilir olup olduğunu Available denetler. Örneğin, cihazın etkin bir İnternet bağlantısı yoksa tanıma kullanılamıyor olabilir.

, iOS cihazında önceden kaydedilmiş dosyanın bulunduğu konumdan oluşturulur ve bir geri çağırma yordamıyla işlemesi için Konuşma SFSpeechUrlRecognitionRequestNSUrl Tanıma'ya devrediliyor.

Geri çağırma çağrıldı mı, NSError yoksa, ele null almaları gereken bir hata oluştu. Konuşma tanıma artımlı olarak tamamlandığından, geri çağırma yordamı birden çok kez çağrılsa da özelliği, çevirinin tamamlandıktan ve çevirinin en iyi sürümünün yazıldığına bakarak test edilir SFSpeechRecognitionResult.Final ( BestTranscription ).

Canlı Konuşma Tanıma

Uygulama canlı konuşmayı tanımak istiyorsa, işlem önceden kaydedilmiş konuşmayı tanımaya çok benzer. Örnek:

using System;
using UIKit;
using Speech;
using Foundation;
using AVFoundation;
...

#region Private Variables
private AVAudioEngine AudioEngine = new AVAudioEngine ();
private SFSpeechRecognizer SpeechRecognizer = new SFSpeechRecognizer ();
private SFSpeechAudioBufferRecognitionRequest LiveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest ();
private SFSpeechRecognitionTask RecognitionTask;
#endregion
...

public void StartRecording ()
{
    // Setup audio session
    var node = AudioEngine.InputNode;
    var recordingFormat = node.GetBusOutputFormat (0);
    node.InstallTapOnBus (0, 1024, recordingFormat, (AVAudioPcmBuffer buffer, AVAudioTime when) => {
        // Append buffer to recognition request
        LiveSpeechRequest.Append (buffer);
    });

    // Start recording
    AudioEngine.Prepare ();
    NSError error;
    AudioEngine.StartAndReturnError (out error);

    // Did recording start?
    if (error != null) {
        // Handle error and return
        ...
        return;
    }

    // Start recognition
    RecognitionTask = SpeechRecognizer.GetRecognitionTask (LiveSpeechRequest, (SFSpeechRecognitionResult result, NSError err) => {
        // Was there an error?
        if (err != null) {
            // Handle error
            ...
        } else {
            // Is this the final translation?
            if (result.Final) {
                Console.WriteLine ("You said \"{0}\".", result.BestTranscription.FormattedString);
            }
        }
    });
}

public void StopRecording ()
{
    AudioEngine.Stop ();
    LiveSpeechRequest.EndAudio ();
}

public void CancelRecording ()
{
    AudioEngine.Stop ();
    RecognitionTask.Cancel ();
}

Bu koda ayrıntılı olarak bakarak, tanıma işlemini işlemek için birkaç özel değişken oluşturur:

private AVAudioEngine AudioEngine = new AVAudioEngine ();
private SFSpeechRecognizer SpeechRecognizer = new SFSpeechRecognizer ();
private SFSpeechAudioBufferRecognitionRequest LiveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest ();
private SFSpeechRecognitionTask RecognitionTask;

Tanıma isteğini işlemek için a'ya geçirilen sesi kaydetmek için AV Foundation SFSpeechAudioBufferRecognitionRequest kullanır:

var node = AudioEngine.InputNode;
var recordingFormat = node.GetBusOutputFormat (0);
node.InstallTapOnBus (0, 1024, recordingFormat, (AVAudioPcmBuffer buffer, AVAudioTime when) => {
    // Append buffer to recognition request
    LiveSpeechRequest.Append (buffer);
});

Uygulama kaydı başlatmaya çalışır ve kayıt başlatılayamazsa tüm hatalar ele alınmaz:

AudioEngine.Prepare ();
NSError error;
AudioEngine.StartAndReturnError (out error);

// Did recording start?
if (error != null) {
    // Handle error and return
    ...
    return;
}

Tanıma görevi başlatıldı ve Tanıma Görevinin ( ) tanıtıcısı SFSpeechRecognitionTask tutulur:

RecognitionTask = SpeechRecognizer.GetRecognitionTask (LiveSpeechRequest, (SFSpeechRecognitionResult result, NSError err) => {
    ...
});

Geri çağırma, yukarıda önceden kaydedilmiş konuşmada kullanılana benzer şekilde kullanılır.

Kayıt kullanıcı tarafından durdurursa, hem Ses Altyapısı hem de Konuşma Tanıma İsteği bilgiye sahip olur:

AudioEngine.Stop ();
LiveSpeechRequest.EndAudio ();

Kullanıcı tanımayı iptal ederse Ses Altyapısı ve Tanıma Görevi bilgi sahibi olur:

AudioEngine.Stop ();
RecognitionTask.Cancel ();

Kullanıcı hem belleği hem de cihazın işlemcisini serbest RecognitionTask.Cancel bırakarak çeviriyi iptal ederse çağrısı yapmak önemlidir.

Önemli

Veya anahtarlarının NSSpeechRecognitionUsageDescriptionNSMicrophoneUsageDescriptionInfo.plist sağlanmama durumu, konuşma tanımaya veya canlı ses için mikrofona () erişmeye çalışırken uygulamanın uyarı olmadan başarısız olmaya neden var node = AudioEngine.InputNode; olabilir. Daha fazla bilgi için lütfen yukarıdaki Kullanım Açıklaması Sağlama bölümüne bakın.

Konuşma Tanıma Sınırları

Apple, bir iOS uygulamasında Konuşma Tanıma ile çalışırken aşağıdaki sınırlamaları dayatıyor:

  • Konuşma Tanıma tüm uygulamalar için ücretsizdir ancak kullanımı sınırsız değildir:
    • Tek tek iOS cihazları, günde gerçekleştirilen sınırlı sayıda tanımaya sahip olur.
    • Uygulamalar günlük istek temelinde küresel olarak kısıtlar.
  • Uygulama, Konuşma Tanıma ağ bağlantısı ve kullanım hızı sınırı hatalarını işlemeye hazır olmalıdır.
  • Konuşma Tanıma'nın hem pil boşaltma hem de kullanıcının iOS cihazında yüksek ağ trafiği maliyeti yüksek olabilir. Bu nedenle Apple, konuşma başına yaklaşık bir dakikalık konuşma süresi sınırı uygulayan bir uygulamadır.

Bir uygulama düzenli olarak hız azaltma sınırlarına ulaşıyorsa Apple, geliştiriciden onlarla iletişim kurmasını isterse.

Gizlilik ve Kullanılabilirlik Konuları

Apple, bir iOS uygulamasına Konuşma Tanıma'nın dahil olduğu bir uygulamada saydam olma ve kullanıcının gizliliğine saygı gösterme önerisine sahip:

  • Kullanıcının konuşmasını kaydederken, kaydın uygulamanın kullanıcı arabiriminde doğru şekilde Kullanıcı Arabirimi. Örneğin, uygulama bir "kayıt" sesi çalarak bir kayıt göstergesi görüntüler.
  • Parolalar, sağlık verileri veya finansal bilgiler gibi hassas kullanıcı bilgileri için Konuşma Tanımayı kullanma.
  • Tanıma sonuçlarını, üzerinde harekete başlamadan önce gösterme. Bu, yalnızca uygulamanın ne yaptığıyla ilgili geri bildirim sağlarken, kullanıcının yapılan tanıma hatalarını işlemesi için de izin verir.

Özet

Bu makalede yeni Konuşma API'si sunulmuştur ve sürekli konuşma tanımayı desteklemek için bir Xamarin.iOS uygulamasında nasıl uygulanarak konuşmanın (canlı veya kayıtlı ses akışlarından) metne nasıl dönüştürülecekleri açıklanmıştır.