Android Konuşma

Bu makale, çok güçlü Android.Speech ad alanını kullanmanın temellerini kapsar. Android, ilk başlangıcından bu yana konuşmayı tanıyıp metin olarak çıktısını almıştır. Nispeten basit bir işlemdir. Ancak metin okuma için, yalnızca konuşma altyapısının dikkate alınması değil, aynı zamanda Metin Okuma (TTS) sisteminden kullanılabilen ve yüklenen dillerin de dikkate alınması gerekmediğinden işlem daha fazla söz konusudur.

Konuşmaya Genel Bakış

İnsan konuşmalarını "anlayan" ve yazılanları (Konuşmayı Metne Dönüştürme ve Metin Okuma) duyuran bir sisteme sahip olmak, cihazlarımız ile doğal iletişim talebi arttıkça mobil geliştirme içinde sürekli büyüyen bir alandır. Metni konuşmaya dönüştüren veya tam tersi bir özelliğe sahip olmanın android uygulamanıza dahil etmek için çok kullanışlı bir araç olduğu birçok örnek vardır.

Örneğin, sürüş sırasında cep telefonu kullanımındaki kelepçenin kapanmasıyla, kullanıcılar cihazlarını eller serbest bir şekilde çalıştırmak ister. Android Wear gibi farklı Android form faktörlerinin bolluğu ve Android cihazları (tabletler ve not defterleri gibi) kullanabilenlerin sürekli genişleyen bir şekilde dahil edilmesi, harika TTS uygulamalarına daha büyük bir odak oluşturmuştur.

Google, android.speech ad alanında bir cihazı "konuşma tanıma" (körler için tasarlanmış yazılımlar gibi) yapma örneklerinin çoğunu kapsayacak şekilde geliştiriciye zengin bir API kümesi sağlar. Ad alanı, metnin aracılığıyla Android.Speech.Ttskonuşmaya çevrilmesini sağlayan özelliği, çeviriyi gerçekleştirmek için kullanılan altyapı üzerinde denetimin yanı sıra konuşmanın RecognizerIntentmetne dönüştürülmesini sağlayan bir dizi sn içerir.

Konuşmanın anlaşılabilmesi için tesisler mevcut olsa da, kullanılan donanıma göre sınırlamalar vardır. Cihazın, mevcut her dilde konuşulan her şeyi başarıyla yorumlaması olası değildir.

Gereksinimler

Bu kılavuz için cihazınızın mikrofonu ve hoparlörü dışında özel gereksinimleri yoktur.

Konuşmayı yorumlayan bir Android cihazının çekirdeği, karşılık gelen OnActivityResultbir ile kullanılmasıdırIntent. Ancak, konuşmanın anlaşılamadığını, ancak metne yorumlandığını anlamak önemlidir. Fark önemlidir.

Anlama ve yorumlama arasındaki fark

Anlamanın basit bir tanımı, söylenenlerin gerçek anlamını ton ve bağlamla belirleyebilmenizdir. Yorumlamak yalnızca sözcükleri alıp başka bir biçimde çıkarmak anlamına gelir.

Günlük konuşmada kullanılan aşağıdaki basit örneği göz önünde bulundurun:

Merhaba nasılsın?

Çile olmadan (belirli sözcüklere veya sözcüklerin bazı bölümlerine vurgu yapılır), basit bir sorudur. Ancak, çizgiye yavaş bir tempo uygulanırsa, dinleyen kişi asker çok mutlu olmadığını ve belki de neşelenmesi gerektiğini veya asker iyi olmadığını algılar. Vurgu "are" üzerine yerleştirilirse, soran kişi genellikle yanıtla daha çok ilgilenir.

Bükme özelliğini kullanmak için oldukça güçlü bir ses işleme ve bağlamı anlamak için bir derece yapay zeka (AI) olmadan, yazılım söylenenleri anlamaya bile başlayamaz; basit bir telefonun yapacağı en iyi şey konuşmayı metne dönüştürmektir.

Ayarlama

Konuşma sistemini kullanmadan önce cihazın mikrofonu olduğundan emin olmak her zaman akıllıca olacaktır. Uygulamanızı mikrofon yüklü olmayan bir Kindle veya Google not defterinde çalıştırmaya çalışmak çok az şey ifade eder.

Aşağıdaki kod örneği, bir mikrofon kullanılabilir olup olmadığını sorgulamayı ve yoksa uyarı oluşturmayı gösterir. Bu noktada kullanılabilir mikrofon yoksa, etkinliği kapatır veya konuşmayı kaydetme özelliğini devre dışı bırakırsınız.

string rec = Android.Content.PM.PackageManager.FeatureMicrophone;
if (rec != "android.hardware.microphone")
{
    var alert = new AlertDialog.Builder(recButton.Context);
    alert.SetTitle("You don't seem to have a microphone to record with");
    alert.SetPositiveButton("OK", (sender, e) =>
    {
        return;
    });
    alert.Show();
}

Amacı oluşturma

Konuşma sisteminin amacı, adlı RecognizerIntentbelirli bir amaç türünü kullanır. Bu amaç, kayıt sona erene kadar sessizlikle ne kadar bekleyeceğiniz, tanınacak ve çıktı alınacak ek diller ve yönerge aracı olarak 'kalıcı iletişim kutusuna eklenecek Intenttüm metinler dahil olmak üzere çok sayıda parametreyi denetler. Bu kod parçacığında, VOICEreadonly int içinde OnActivityResulttanıma için kullanılır.

var voiceIntent = new Intent(RecognizerIntent.ActionRecognizeSpeech);
voiceIntent.PutExtra(RecognizerIntent.ExtraLanguageModel, RecognizerIntent.LanguageModelFreeForm);
voiceIntent.PutExtra(RecognizerIntent.ExtraPrompt, Application.Context.GetString(Resource.String.messageSpeakNow));
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);

Konuşmanın dönüştürülmesi

Konuşmadan yorumlanan metin, etkinliği tamamlandığında döndürülen ve aracılığıyla GetStringArrayListExtra(RecognizerIntent.ExtraResults)erişilen içinde Intentteslim edilir. Bu, çağıranın amacında istenen dillerin sayısına (ve içinde belirtilen) bağlı olarak dizinin kullanılıp görüntülenebileceği RecognizerIntent.ExtraMaxResultsbir IList<string>döndürür. Yine de herhangi bir listede olduğu gibi, görüntülenecek veri olduğundan emin olmak için kontrol etmeye değer.

değerinin dönüş değerini StartActivityForResultdinlerken yönteminin OnActivityResult sağlanması gerekir.

Aşağıdaki örnekte, textBox dikte edilenleri çıkarmak için kullanılan bir TextBox örnektir. Metni bir yorumlayıcı biçimine geçirmek için de aynı şekilde kullanılabilir ve oradan uygulama, metni ve dalı uygulamanın başka bir bölümüyle karşılaştırabilir.

protected override void OnActivityResult(int requestCode, Result resultVal, Intent data)
{
    if (requestCode == VOICE)
    {
        if (resultVal == Result.Ok)
        {
            var matches = data.GetStringArrayListExtra(RecognizerIntent.ExtraResults);
            if (matches.Count != 0)
            {
                string textInput = textBox.Text + matches[0];
                textBox.Text = textInput;
                switch (matches[0].Substring(0, 5).ToLower())
                {
                    case "north":
                        MovePlayer(0);
                        break;
                    case "south":
                        MovePlayer(1);
                        break;
                }
            }
            else
            {
                textBox.Text = "No speech was recognised";
            }
        }
        base.OnActivityResult(requestCode, resultVal, data);
    }
}

Metin Okuma

Metin okuma, metnin tam tersi değildir ve iki temel bileşene dayanır; cihaza yüklenen bir metin okuma altyapısı ve yüklü olan bir dil.

Büyük ölçüde, Android cihazlar varsayılan Google TTS hizmeti yüklü ve en az bir dil ile gelir. Bu, cihaz ilk kurulduğunda kurulur ve cihazın o sırada nerede olduğuna bağlıdır (örneğin, Almanya'da kurulan bir telefon Almanca dilini yüklerken, Amerika'daki bir telefon Amerikan İngilizcesine sahip olacaktır).

1. Adım - TextToSpeech Örneğini Oluşturma

TextToSpeech en fazla 3 parametre alabilir, ilk ikisi gereklidir ve üçüncü parametre isteğe bağlıdır (AppContext, IOnInitListener, engine). Dinleyici, hizmete bağlanmak ve altyapının herhangi bir sayıda kullanılabilir Android metni ile konuşma altyapıları arasında hata olup olmadığını test etmek için kullanılır. Cihaz en azından Google'ın kendi motoruna sahip olacaktır.

2. Adım - Kullanılabilir dilleri bulma

Java.Util.Locale sınıfı adlı GetAvailableLocales()yararlı bir yöntem içerir. Konuşma altyapısı tarafından desteklenen bu dil listesi, yüklü dillerde test edilebilir.

"Anlaşılan" dillerin listesini oluşturmak önemsiz bir konudur. Her zaman varsayılan bir dil (kullanıcının cihazını ilk ayarlarken ayarladığı dil) olacaktır, bu nedenle bu örnekte List<string> ilk parametre olarak "Varsayılan" değeri bulunur, listenin geri kalanı sonucunun textToSpeech.IsLanguageAvailable(locale)bağlı olarak doldurulur.

var langAvailable = new List<string>{ "Default" };
var localesAvailable = Java.Util.Locale.GetAvailableLocales().ToList();
foreach (var locale in localesAvailable)
{
    var res = textToSpeech.IsLanguageAvailable(locale);
    switch (res)
    {
        case LanguageAvailableResult.Available:
          langAvailable.Add(locale.DisplayLanguage);
          break;
        case LanguageAvailableResult.CountryAvailable:
          langAvailable.Add(locale.DisplayLanguage);
          break;
        case LanguageAvailableResult.CountryVarAvailable:
          langAvailable.Add(locale.DisplayLanguage);
          break;
    }
}
langAvailable = langAvailable.OrderBy(t => t).Distinct().ToList();

Bu kod, belirli bir yerel ayar için dil paketinin cihazda zaten mevcut olup olmadığını test etmek için TextToSpeech.IsLanguageAvailable öğesini çağırır. Bu yöntem, geçirilen yerel ayar için dilin kullanılabilir olup olmadığını gösteren bir LanguageAvailableResult döndürür. Dilin olduğunu belirtirse LanguageAvailableResult , bu dil NotSupportediçin kullanılabilir bir ses paketi (indirme için bile) yoktur. olarak ayarlanırsa LanguageAvailableResultMissingData, 4. Adımda aşağıda açıklandığı gibi yeni bir dil paketi indirebilirsiniz.

3. Adım - Hızı ve perdeyi ayarlama

Android, kullanıcının ve Pitch (konuşmanın hızı ve tonu) ayarını değiştirerek SpeechRate konuşmanın sesini değiştirmesine olanak tanır. Bu 0'dan 1'e geçer ve her ikisi için de "normal" konuşma 1 olur.

4. Adım - Yeni dilleri test etme ve yükleme

Yeni bir dil indirme işlemi, kullanılarak Intentgerçekleştirilir. Bu amacın sonucu OnActivityResult yönteminin çağrılmaya neden olur. Konuşmayı metne dönüştürme örneğinden farklı olarak (recognizerIntent parametresini Intentparametresi olarak PutExtra kullandı), test ve yükleme Intents -tabanlıdırAction:

Aşağıdaki kod örneği, dil kaynaklarını test etmek ve yeni bir dil indirmek için bu eylemlerin nasıl kullanılacağını gösterir:

var checkTTSIntent = new Intent();
checkTTSIntent.SetAction(TextToSpeech.Engine.ActionCheckTtsData);
StartActivityForResult(checkTTSIntent, NeedLang);
//
protected override void OnActivityResult(int req, Result res, Intent data)
{
    if (req == NeedLang)
    {
        var installTTS = new Intent();
        installTTS.SetAction(TextToSpeech.Engine.ActionInstallTtsData);
        StartActivity(installTTS);
    }
}

TextToSpeech.Engine.ActionCheckTtsData dil kaynaklarının kullanılabilirliğini test etme. OnActivityResult bu test tamamlandığında çağrılır. Dil kaynaklarının indirilmesi gerekiyorsa, OnActivityResultTextToSpeech.Engine.ActionInstallTtsData kullanıcının gerekli dilleri indirmesine olanak tanıyan bir etkinlik başlatmak için eylemi başlatır. Bu OnActivityResult basitleştirilmiş örnekte dil paketinin Result indirilmesi gerektiği belirlendiğinden, bu uygulamanın kodu denetlemediğini unutmayın.

Bu TextToSpeech.Engine.ActionInstallTtsData eylem, Google TTS ses verileri etkinliğinin indirilecek dilleri seçmesi için kullanıcıya sunulmasına neden olur:

Google TTS Ses Verileri Etkinliği

Örneğin, kullanıcı Fransızca'yı seçip indirme simgesine tıklayarak Fransızca ses verilerini indirebilir:

Fransızca dilini indirme örneği

Bu verilerin yüklenmesi, indirme tamamlandıktan sonra otomatik olarak gerçekleşir.

5. Adım - IOnInitListener

Bir etkinliğin metni konuşmaya dönüştürebilmesi için arabirim yönteminin OnInit uygulanması gerekir (bu, sınıfın örneği TextToSpeech için belirtilen ikinci parametredir). Bu, dinleyiciyi başlatır ve sonucu test eder.

Dinleyicinin hem hem de OperationResult.SuccessOperationResult.Failure en azından test etmesi gerekir. Aşağıdaki örnekte yalnızca şunu gösterilmektedir:

void TextToSpeech.IOnInitListener.OnInit(OperationResult status)
{
    // if we get an error, default to the default language
    if (status == OperationResult.Error)
        textToSpeech.SetLanguage(Java.Util.Locale.Default);
    // if the listener is ok, set the lang
    if (status == OperationResult.Success)
        textToSpeech.SetLanguage(lang);
}

Özet

Bu kılavuzda, metni konuşmaya ve konuşmayı metne dönüştürmenin temellerini ve bunları kendi uygulamalarınıza eklemenin olası yöntemlerini inceledik. Bunlar belirli her olayı kapsamasa da artık konuşmanın nasıl yorumlandığı, yeni dillerin nasıl yükleneceği ve uygulamalarınızın karmaşıklığını nasıl artıracağınız hakkında temel bilgilere sahip olmanız gerekir.