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.Tts
konuşmaya çevrilmesini sağlayan özelliği, çeviriyi gerçekleştirmek için kullanılan altyapı üzerinde denetimin yanı sıra konuşmanın RecognizerIntent
metne 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 OnActivityResult
bir 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ı RecognizerIntent
belirli 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 Intent
tüm metinler dahil olmak üzere çok sayıda parametreyi denetler. Bu kod parçacığında, VOICE
readonly int
içinde OnActivityResult
tanı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 Intent
teslim 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.ExtraMaxResults
bir 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 StartActivityForResult
dinlerken 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 NotSupported
için kullanılabilir bir ses paketi (indirme için bile) yoktur. olarak ayarlanırsa LanguageAvailableResult
MissingData
, 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 Intent
gerç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 Intent
parametresi olarak PutExtra
kullandı), test ve yükleme Intent
s -tabanlıdırAction
:
TextToSpeech.Engine.ActionCheckTtsData – Cihazdaki dil kaynaklarının düzgün yüklenmesini ve kullanılabilirliğini doğrulamak için platform
TextToSpeech
altyapısından bir etkinlik başlatır.TextToSpeech.Engine.ActionInstallTtsData – Kullanıcıdan gerekli dilleri indirmesini isteyen bir etkinlik başlatı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ö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, OnActivityResult
TextToSpeech.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:
Örneğin, kullanıcı Fransızca'yı seçip indirme simgesine tıklayarak Fransızca ses verilerini indirebilir:
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.Success
OperationResult.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.