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ı (canlı veya kayıtlı ses akışlarından) metne dönüştürmek için Xamarin.iOS uygulamasında uygulamayı 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ürmesini sağlayan Konuşma Tanıma API'sini kullanıma sunms.

Apple'a göre, Konuşma Tanıma API'sinin aşağıdaki özellikleri ve avantajları vardır:

  • 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, bir iOS uygulamasında canlı veya önceden kaydedilmiş ses (API'nin desteklediği konuşulan dillerden herhangi birinde) alınıp bu sesi, konuşulan sözcüklerin düz metin dökümünü döndüren bir Konuşma Tanıma'ya geçirerek uygulanır.

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

Klavye Diktesi

Kullanıcıların çoğu iOS cihazında Konuşma Tanıma'yı düşünürken, iOS 5'te iPhone 4S ile Klavye Diktesi ile birlikte yayınlanan yerleşik Siri ses yardımcısını düşünür.

Klavye Diktesi, TextKit'i (veya gibi UITextField UITextArea) destekleyen herhangi bir arabirim öğesi tarafından desteklenir ve iOS sanal klavyesinde Dikte Düğmesi'ne (ara çubuğunun doğrudan solunda) tıklayarak kullanıcı tarafından etkinleştirilir.

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

  • Klavye Diktesi, iOS 5'te kullanıma sunulduğundan beri yaygın olarak kullanılmaktadır.
  • Günde yaklaşık 65.000 uygulama tarafından kullanılır.
  • Tüm iOS Dikte etme işleminin 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 çaba harcamasına gerek yoktur. Klavye Diktesi, kullanılmadan önce uygulamadan herhangi bir özel ayrıcalık isteği gerektirmeme avantajına da sahiptir.

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

Klavye Diktesi'nin uygulanması kolay olsa da, çeşitli sınırlamalar ve dezavantajlar ile birlikte gelir:

  • Metin Giriş Alanı'nın kullanılmasını ve klavyenin görüntülenmesini gerektirir.
  • Yalnızca canlı ses girişiyle çalışır ve uygulamanın ses kayıt işlemi üzerinde hiçbir denetimi yoktur.
  • Kullanıcının konuşmasını yorumlamak için kullanılan dil üzerinde denetim sağlamaz.
  • Uygulamanın Dikte düğmesinin kullanıcının kullanımına açık olup olmadığını bilmesinin hiçbir yolu yoktur.
  • Uygulama ses kayıt işlemini özelleştiremiyor.
  • Zamanlama ve güvenilirlik gibi bilgileri olmayan çok sığ 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 yayınladı. Bu API, Apple'ın hem Siri hem de Klavye Diktesi'ni desteklemek için kullandığı api ile aynıdır ve en yüksek düzeyde doğrulukla hızlı transkripsiyon sağlama özelliğine sahiptir.

Konuşma Tanıma API'sinin sağladığı sonuçlar, uygulamanın herhangi bir özel kullanıcı verisi toplamasına veya erişmesine gerek kalmadan tek tek kullanıcılara saydam bir şekilde özelleştirilir.

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

  • Kullanıcının söylediklerinin birden çok yorumu.
  • Bireysel çeviriler için güvenilirlik 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 dil ve diyalektten herhangi birinde sağlanabilir.

Konuşma Tanıma API'si, iOS 10 çalıştıran herhangi bir iOS cihazında kullanılabilir ve çoğu durumda, çevirilerin büyük bölümü Apple'ın sunucularında gerçekleştiğinden canlı İnternet bağlantısı gerektirir. Buna göre, bazı yeni iOS cihazları belirli dillerin her zaman açık, cihaz içi çevirisini destekler.

Apple, şu anda belirli bir dilin çeviri için kullanılabilir olup olmadığını belirlemek için bir Kullanılabilirlik API'sini eklemiştir. Uygulama, doğrudan İnternet bağlantısını test etme yerine bu API'yi kullanmalıdır.

Yukarıda Klavye Diktesi bölümünde belirtildiği gibi, konuşma tanıma, Apple'ın sunucularındaki verilerin İnternet üzerinden iletilmesini ve geçici olarak depolanmasını gerektirir ve bu nedenle uygulama, anahtarı Info.plist dosyasına ekleyerek NSSpeechRecognitionUsageDescription ve yöntemini çağırarak tanıma gerçekleştirmek için kullanıcının iznini SFSpeechRecognizer.RequestAuthorization istemelidir.

Konuşma Tanıma için kullanılan sesin kaynağına bağlı olarak, uygulamanın Info.plist dosyasında başka değişiklikler yapılması 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ı benimsemek için atması gereken dört önemli adım vardır:

  • Anahtarı kullanarak NSSpeechRecognitionUsageDescription uygulamanın Info.plist dosyasında bir kullanım açıklaması sağlayın. Örneğin, bir kamera uygulaması şu açıklamayı içerebilir: "Bu, yalnızca 'peynir' sözcüğünü söyleyerek fotoğraf çekmenizi sağlar."
  • Uygulamanın bir iletişim kutusunda kullanıcıya neden konuşma tanıma erişimi istediğini ve kabul etmelerine veya reddetmelerine izin vermelerini sağlayan bir açıklama (yukarıdaki anahtarda NSSpeechRecognitionUsageDescription verilmiştir) sunmak için yöntemini çağırarak SFSpeechRecognizer.RequestAuthorization yetkilendirme isteyin.
  • 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ğini Bir Konuşma Tanımaya (SFSpeechRecognizer) geçirin. Uygulama isteğe bağlı olarak, tanıma sonuçlarını izlemek ve izlemek için döndürüleni SFSpeechRecognitionTask tutabilir.

Bu adımlar aşağıda ayrıntılı olarak ele alınacaktır.

Kullanım Açıklaması Sağlama

Dosyada Info.plist gerekli NSSpeechRecognitionUsageDescription anahtarı sağlamak için aşağıdakileri yapın:

  1. Düzenlemek üzere açmak için dosyaya çift tıklayın Info.plist .

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

    Kaynak görünümü

  3. Yeni Girdi Ekle'ye tıklayın, Tür için Özellik girin String ve Değer olarak bir Kullanım Açıklaması girin NSSpeechRecognitionUsageDescription . Örneğin:

    NSSpeechRecognitionUsageDescription ekleme

  4. Uygulama canlı ses transkripsiyonunu işleyecekse, bir Mikrofon Kullanımı Açıklaması da gerektirir. Yeni Girdi Ekle'ye tıklayın, Tür için Özellik girin String ve Değer olarak bir Kullanım Açıklaması girin NSMicrophoneUsageDescription . Örneğin:

    NSMicrophoneUsageDescription ekleme

  5. Dosyadaki değişiklikleri kaydedin.

Önemli

Yukarıdaki Info.plist tuşlardan birinin (NSSpeechRecognitionUsageDescription veya ) sağlanamaması, canlı ses için Konuşma Tanıma'ya NSMicrophoneUsageDescriptionveya mikrofona erişmeye çalışırken uygulamanın uyarı vermeden başarısız olmasıyla sonuçlanabilir.

Yetkilendirme İsteniyor

Uygulamanın konuşma tanımaya erişmesine izin veren gerekli kullanıcı yetkilendirmesini istemek 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;
                }
            });
        }
    }
}

RequestAuthorization sınıfının yöntemi, geliştiricinin SFSpeechRecognizer dosyanın anahtarında sağladığı nedeni kullanarak kullanıcıdan konuşma tanımaya erişim izni isteyecektir NSSpeechRecognitionUsageDescription Info.plist.

SFSpeechRecognizerAuthorizationStatus Yöntemin RequestAuthorization geri çağırma yordamına, kullanıcının iznine göre işlem yapmak için kullanılabilecek bir sonuç döndürülür.

Önemli

Apple, kullanıcı uygulamada bu izni istemeden ö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 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 baktığımızda, önce bir Konuşma Tanıma (SFSpeechRecognizer ) oluşturmaya çalışır. Konuşma tanıma için varsayılan dil desteklenmiyorsa, null döndürülür ve işlevler çıkar.

Konuşma Tanıma varsayılan dil için kullanılabiliyorsa, uygulama özelliği kullanılarak Available şu anda tanıma için kullanılabilir olup olmadığını denetler. Örneğin, cihazın etkin bir İnternet bağlantısı yoksa tanıma kullanılamayabilir.

, SFSpeechUrlRecognitionRequest iOS cihazında önceden kaydedilmiş dosyanın konumundan NSUrl oluşturulur ve geri çağırma yordamıyla işlenmesi için Konuşma Tanıma'ya teslim edilir.

Geri çağırma çağrıldığında, NSError null değilse işlenmesi gereken bir hata oluştu. Konuşma tanıma artımlı olarak yapıldığından, geri çağırma yordamı birden çok kez çağrılabilir, bu nedenle özellik çevirinin SFSpeechRecognitionResult.Final tamamlanıp tamamlanmadığı ve çevirinin en iyi sürümünün yazılıp yazılmadığını (BestTranscription ) görmek için test edilir.

Canlı Konuşmayı Tanıma

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

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 baktığımızda, 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 üzere bir'e SFSpeechAudioBufferRecognitionRequest geçirilecek sesi kaydetmek için AV Foundation'ı 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ılamıyorsa tüm hatalar işlenir:

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ılır ve Tanıma Görevi'ne (SFSpeechRecognitionTask):

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

Geri arama, yukarıda önceden kaydedilmiş konuşmada kullanılana benzer bir şekilde kullanılır.

Kayıt kullanıcı tarafından durduruluyorsa, hem Ses Altyapısı hem de Konuşma Tanıma İsteği bilgilendirilir:

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

Kullanıcı tanımayı iptal ederse Ses Altyapısı ve Tanıma Görevi şu şekilde bilgilendirilir:

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

Kullanıcı hem belleği hem de cihazın işlemcisini boşaltmak için çeviriyi iptal ederse çağrı RecognitionTask.Cancel yapmak önemlidir.

Önemli

veya Info.plist NSMicrophoneUsageDescription tuşlarının sağlanamamasıNSSpeechRecognitionUsageDescription, canlı ses (var node = AudioEngine.InputNode;) için Konuşma Tanıma'ya veya mikrofona erişmeye çalışırken uygulamanın uyarı olmadan başarısız olmasıyla sonuçlanabilir. 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ı uygular:

  • 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ştirilebilecek sınırlı sayıda tanımaya sahiptir.
    • Uygulamalar, günlük istek temelinde genel olarak kısıtlanır.
  • 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, kullanıcının iOS cihazında hem pil boşaltma hem de yüksek ağ trafiğinde yüksek maliyete sahip olabilir, bu nedenle Apple yaklaşık bir dakikalık konuşma maksimum katı bir ses süresi sınırı uygular.

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

Gizlilik ve Kullanılabilirlik Konuları

Apple, iOS uygulamasına Konuşma Tanıma özelliğini dahil ederken şeffaf olmak ve kullanıcının gizliliğine saygı duyma konusunda aşağıdaki öneriyi sunar:

  • Kullanıcının konuşmasını kaydederken, kaydın uygulamanın Kullanıcı Arabiriminde gerçekleştiğini açıkça belirttiğinizden emin olun. Örneğin, uygulama bir "kayıt" sesi çalabilir ve bir kayıt göstergesi görüntüleyebilir.
  • Parolalar, sistem durumu verileri veya finansal bilgiler gibi hassas kullanıcı bilgileri için Konuşma Tanıma'yı kullanmayın.
  • Üzerinde işlemden önce tanıma sonuçlarını gösterin. Bu yalnızca uygulamanın ne yaptığına ilişkin geri bildirim sağlamakla kalmaz, aynı zamanda kullanıcının yapılan tanıma hatalarını işlemesine de olanak tanır.

Özet

Bu makale, yeni Konuşma API'sini sundu ve sürekli konuşma tanımayı desteklemek ve konuşmayı (canlı veya kayıtlı ses akışlarından) metne dönüştürmek için Xamarin.iOS uygulamasında nasıl uygulandığını gösterdi.