Android konuşma

Bu makalede, çok güçlü Android. Speech ad alanını kullanmanın temelleri ele alınmaktadır. Bu tarihten itibaren, Android konuşmayı algılayabilir ve metin olarak çıktısını alabilir. Bu görece basit bir işlemdir. Bununla birlikte, metin okuma için, yalnızca konuşma altyapısının hesaba alınması ve ayrıca metinden konuşmaya (TTS) sisteminde de yüklü olan dilleri de dikkate alınmasının yanı sıra işlem daha da vardır.

Konuşmaya genel bakış

İnsan konuşmasını "anlayan" anlayan ve ne yazmakta olduğunu anlayan bir sistem (örneğin, konuşma ve Metin Okuma), cihazlarımızla doğal iletişim talebi olarak mobil geliştirme kapsamındaki sürekli büyüyen bir alandır. Metni konuşmaya dönüştüren bir özelliğin olduğu çok sayıda örnek vardır veya bunun tersini yapmak, Android uygulamanıza dahil etmek için kullanışlı bir araçtır.

Örneğin, mobil telefon kullanımı sırasında mobil telefon kullanımına açık bir şekilde, kullanıcılar cihazlarını çalıştırmak için ücretsiz bir yöntem ister. Farklı Android form faktörlerinin (örneğin, Android gibi) Plethora ve Android cihazları (tabletler ve dekont 'ler gibi) kullanabileklerinin sürekli olarak kullanılması, harika TTS uygulamalarına daha büyük bir odak oluşturmuştur.

Google, Android. Speech ad alanında bir cihaz "konuşma duyarlı" (görme için tasarlanan yazılımlar gibi) çok sayıda örneği kapsayacak şekilde geliştirici sağlar. Ad alanı, metnin konuşmaya dönüştürülmesine izin veren tesisi Android.Speech.Tts , çeviriyi gerçekleştirmek için kullanılan altyapıya denetim, ve RecognizerIntent konuşmayı metne dönüştürülmesine izin veren bir sayısını içerir.

Tesislerin anlaşılması, konuşmadan dolayı, kullanılan donanıma dayalı sınırlamalar vardır. Cihazın sunulan her dilde konuşulmasını başarılı bir şekilde yorumlaması olası bir şeydir.

Gereksinimler

Bu kılavuzda, cihazınızın mikrofon ve konuşmacı olması dışında özel bir gereksinim yoktur.

Bir Android cihazın konuşmayı yorumlama çekirdeği, Intent karşılık gelen bir ile birlikte kullanılır OnActivityResult . Bu, konuşmanın anlaşılmadığı, ancak metne yorumlanan olduğunu tanımak açısından önemlidir. Fark önemlidir.

Anlama ve yorumlama arasındaki fark

Anlama basit bir tanımı, ton ve bağlam ile anladıklarıyla ilgili gerçek anlamı belirleyerek belirleyebilinizin bir tanımıdır. Yalnızca sözcükleri almak ve bunları başka bir biçimde çıkarmak için bir anlamı yorumlamak.

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

Merhaba nasılsın?

Melet olmadan (belirli sözcüklere veya sözcüklerin bölümlerine yerleştirilmiş), bu basit bir sorudır. Ancak, hat için yavaş bir ilerleme uygulanmışsa, dinleme yapan kişi, asker 'ın çok memnun olmadığını ve belki de bir oker 'ın iyi olduğunu algılar. Vurgu "SIS" üzerine yerleştirilmişse, isteyen kişi genellikle yanıtta daha fazla ilgileniyor.

Bilişsel ' i ve bağlamı anlamak üzere yapay zeka (AI) kullanımını sağlamak için oldukça güçlü bir ses işleme olmadan, yazılım, ne olduğunu anlamak için bile başlayamaz; bir basit telefonun yaptığı en iyi şekilde konuşmayı metne dönüştürürsünüz.

Ayarlanıyor

Konuşma sistemini kullanmadan önce, cihazın bir mikrofona sahip olduğundan emin olmak her zaman bir denetim olur. Uygulamanızı bir mikrofonla veya Google Not defterinde bir mikrofon yüklü olmadan çalıştırmaya çok kısa bir nokta olabilir.

Aşağıdaki kod örneği, bir mikrofonun kullanılabilir olup olmadığını ve uyarı oluşturmak için sorgu gösterir. Bu noktada hiçbir mikrofon yoksa, etkinlikten çıkmanız veya konuşmayı kaydetme özelliğini devre dışı bırakmanız gerekir.

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ı belirli bir amaç türünü kullanır RecognizerIntent . Bu amaç, kayıt üzerinde değerlendirilene kadar sessizlik ile ne kadar süreyle bekleneceği, tanıması ve çıkışı yapılacak ek dillerin yanı sıra herhangi bir metnin, Intent yönerge yöntemi olarak kalıcı iletişim kutusuna dahil edilmesi için de dahil olmak üzere çok sayıda parametreyi denetler. Bu kod parçacığında, VOICEreadonly int içinde tanınabilmesi için kullanılır OnActivityResult .

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şmayı dönüştürme

Konuşmadan yorumlanan metin, Intent etkinlik tamamlandığında ve aracılığıyla erişildiğinde döndürülen içinde teslim edilir GetStringArrayListExtra(RecognizerIntent.ExtraResults) . Bu, IList<string> arayanın amacına (ve içinde belirtilen) göre istenen dillerin sayısına bağlı olarak dizinin kullanılabileceği ve görüntüleneceği bir döndürür RecognizerIntent.ExtraMaxResults . Ancak, herhangi bir listede olduğu gibi, görüntülenecek verilerin olduğundan emin olmak için bu değer kontrol edilir.

Bir öğesinin dönüş değerini dinlerken StartActivityForResult , OnActivityResult yönteminin sağlanması gerekir.

Aşağıdaki örnekte, textBoxTextBox dikte edilecek öğeleri almak için kullanılır. Bu, metni bazı yorumlayıcı biçimine iletmek için de kullanılabilir ve buradan, uygulama metin ve dalı uygulamanın başka bir bölümüyle karşılaştırabilirler.

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

Metinden konuşmaya yalnızca konuşmayı metne geri çevirme ve iki temel bileşene bağımlı değildir; cihaza ve yüklenmekte olan bir dile bir metinden konuşmaya motoru.

Büyük ölçüde Android cihazlar varsayılan Google TTS Hizmeti yüklenmiş ve en az bir dil ile gelir. Bu, cihaz ilk kez ayarlandığında ve cihazın zaman içinde olduğu yere göre belirlenir (örneğin, Almanya 'da bir telefon kurulumu Almanca dili yükler, ancak Amerika 'da Ingilizce 'nin Ingilizce 'si olur).

1. adım-TextToSpeech örnekleme

TextToSpeech , 3 ' e kadar parametreye kadar, üçüncü kez isteğe bağlı ( AppContext , IOnInitListener ,) olması gerekir engine . Dinleyici, hizmete bağlanmak ve altyapıda herhangi bir sayıda kullanılabilir Android metin okuma altyapısına kadar hata için test etmek üzere kullanılır. En azından, cihazda Google 'ın kendi altyapısı olacaktır.

2. adım-kullanılabilir dilleri bulma

Java.Util.LocaleSınıfı, adlı faydalı bir yöntem içerir GetAvailableLocales() . Konuşma motorunun desteklediği dillerin bu listesi daha sonra yüklü dillere karşı test edilebilir.

"Anlamış" dillerin listesini oluşturmak çok önemlidir. Her zaman varsayılan bir dil (Kullanıcı, cihazlarını ilk ayarlarken ayarlanan dil) olacaktır. bu nedenle, bu örnekte List<string> ilk parametre olarak "default" bulunur ve listenin geri kalanı, ' nin sonucuna göre doldurulur textToSpeech.IsLanguageAvailable(locale) .

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. ıslanguage' i çağırır. Bu yöntem, geçilen yerel ayar için dilin kullanılabilir olup olmadığını gösteren bir Languagekullanılabilirliği Bleresultdöndürür. LanguageAvailableResultDilin olduğunu gösteriyorsa NotSupported , bu dil için kullanılabilir ses paketi yok (indirme için bile). LanguageAvailableResultOlarak ayarlanırsa MissingData , adım 4 ' te aşağıda açıklandığı gibi yeni bir dil paketi indirmek mümkündür.

3. adım-hız ve Aralık ayarlama

Android, SpeechRate ve ' i Pitch (hız hızı ve konuşma tonu) değiştirerek kullanıcının konuşma sesini değiştirmesine izin verir. Bu, her ikisi için "normal" konuşma ile 0 ' dan 1 ' e gider.

4. adım-yeni dilleri test etme ve yükleme

Yeni bir dilin indirilmesi, kullanılarak gerçekleştirilir Intent . Bu amacın sonucu Onactivityresult yönteminin çağrılmasına neden olur. Konuşmadan metne örneğinden (için parametre olarak Recognizeramacını kullanan) farklı olarak Intent , test ve yükleme Intent işlemleri Action tabanlıdır:

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östermektedir:

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 sınar. OnActivityResult Bu test tamamlandığında çağrılır. Dil kaynakları indirilmek gerekirse, OnActivityResultTextToSpeech.Engine.ActionInstallTtsData kullanıcının gerekli dilleri indirmesini sağlayan bir etkinlik başlatmak için eylemi devre dışı bırakın. Bu OnActivityResult uygulamanın kodu denetlemediğini unutmayın Result çünkü bu Basitleştirilmiş örnekte, dil paketinin indirilmesi gereken belirlenmesi daha önceden yapılmıştır.

TextToSpeech.Engine.ActionInstallTtsDataEylem, TextToSpeech.Engine.ActionInstallTtsData etkinliğinin karşıdan yüklenecek dilleri seçerken kullanıcıya sunulmasını sağlar:

Google TTS ses verileri etkinliği

Örnek olarak, Kullanıcı Fransızca seçip indir simgesine tıklayarak Fransızca ses verilerini indirebilirsiniz:

Fransızca dil indirme örneği

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

5. adım-ıonınitlistener

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

Dinleyici hem hem de en azından için test etmelidir OperationResult.SuccessOperationResult.Failure . Aşağıdaki örnek yalnızca şunları gösterir:

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, metin okuma ve konuşmayı metne dönüştürme ve kendi uygulamalarınıza nasıl dahil edileceğini gösteren olası yöntemler hakkında temel bilgilere baktık. Her bir durumu kapsamıyorlar, artık konuşmanın nasıl yorumlandığına, yeni dillerin nasıl yükleneceğine ve uygulamalarınızın her birinin nasıl artacağına ilişkin temel bilgiye sahip olmanız gerekir.