Ucapan Android
Artikel ini membahas dasar-dasar penggunaan namespace Android.Speech yang sangat kuat. Sejak awal, Android telah dapat mengenali ucapan dan mengeluarkannya sebagai teks. Ini adalah proses yang relatif sederhana. Namun, untuk teks ke ucapan, prosesnya lebih terlibat, karena mesin ucapan tidak hanya harus diperhitungkan, tetapi juga bahasa yang tersedia dan diinstal dari sistem Teks Ke Ucapan (TTS).
Gambaran Umum Ucapan
Memiliki sistem, yang "memahami" ucapan manusia dan mengucap apa yang sedang ditik—Ucapan ke Teks, dan Teks ke Ucapan—adalah area yang terus berkembang dalam pengembangan seluler saat permintaan komunikasi alami dengan perangkat kami meningkat. Ada banyak instans di mana memiliki fitur yang mengonversi teks menjadi ucapan, atau sebaliknya, adalah alat yang sangat berguna untuk dimasukkan ke dalam aplikasi android Anda.
Misalnya, dengan penjepit pada penggunaan ponsel saat mengemudi, pengguna menginginkan cara tangan bebas mengoperasikan perangkat mereka. Banyaknya berbagai faktor bentuk Android—seperti Android Wear—dan inklusi yang terus melebar dari mereka yang dapat menggunakan perangkat Android (seperti tablet dan note pad), telah menciptakan fokus yang lebih besar pada aplikasi TTS yang hebat.
Google memasok pengembang dengan sekumpulan API yang kaya di namespace Android.Speech untuk mencakup sebagian besar instans membuat perangkat "sadar ucapan" (seperti perangkat lunak yang dirancang untuk buta). Namespace layanan mencakup fasilitas untuk memungkinkan teks diterjemahkan ke dalam ucapan melalui Android.Speech.Tts
, kontrol atas mesin yang digunakan untuk melakukan terjemahan, serta sejumlah RecognizerIntent
yang memungkinkan ucapan dikonversi ke teks.
Sementara fasilitas ada untuk ucapan yang akan dipahami, ada batasan berdasarkan perangkat keras yang digunakan. Tidak mungkin perangkat akan berhasil menafsirkan semua yang diucapkan dalam setiap bahasa yang tersedia.
Persyaratan
Tidak ada persyaratan khusus untuk panduan ini, selain perangkat Anda yang memiliki mikrofon dan speaker.
Inti dari perangkat Android yang menginterpretasikan ucapan adalah penggunaan Intent
dengan OnActivityResult
.
Namun, penting untuk mengenali bahwa ucapan tidak dipahami—tetapi ditafsirkan ke teks. Perbedaannya penting.
Perbedaan antara pemahaman dan interpretasi
Definisi pemahaman sederhana adalah Anda dapat menentukan dengan nada dan konteks arti nyata dari apa yang dikatakan. Untuk menafsirkan hanya berarti mengambil kata-kata dan mengeluarkannya dalam bentuk lain.
Pertimbangkan contoh sederhana berikut yang digunakan dalam percakapan sehari-hari:
Halo bagaimana keadaanmu?
Tanpa infleksi (penekanan yang ditempatkan pada kata-kata atau bagian kata tertentu), itu adalah pertanyaan sederhana. Namun, jika kecepatan lambat diterapkan pada garis, orang yang mendengarkan akan mendeteksi bahwa penanya tidak terlalu senang dan mungkin perlu bersorak atau bahwa penanya tidak sehat. Jika penekanan ditempatkan pada "are", orang yang bertanya biasanya lebih tertarik dengan responsnya.
Tanpa pemrosesan audio yang cukup kuat untuk menggunakan infleksi, dan tingkat kecerdasan buatan (AI) untuk memahami konteks, perangkat lunak bahkan tidak dapat mulai memahami apa yang dikatakan —yang terbaik yang dapat dilakukan ponsel sederhana adalah mengonversi ucapan ke teks.
Menyiapkan
Sebelum menggunakan sistem ucapan, selalu bijaksana untuk memeriksa untuk memastikan perangkat memiliki mikrofon. Akan ada sedikit titik mencoba menjalankan aplikasi Anda di Kindle atau Google note pad tanpa mikrofon yang diinstal.
Sampel kode di bawah ini menunjukkan kueri jika mikrofon tersedia dan jika tidak, untuk membuat pemberitahuan. Jika tidak ada mikrofon yang tersedia pada saat ini Anda akan keluar dari aktivitas atau menonaktifkan kemampuan untuk merekam ucapan.
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();
}
Membuat niat
Niat untuk sistem ucapan menggunakan jenis niat tertentu yang disebut RecognizerIntent
. Niat ini mengontrol sejumlah besar parameter, termasuk berapa lama menunggu dengan keheningan sampai rekaman dipertimbangkan, bahasa tambahan apa pun untuk dikenali dan dihasilkan, dan teks apa pun untuk disertakan pada Intent
dialog modal 's sebagai sarana instruksi. Dalam cuplikan ini, VOICE
digunakan readonly int
untuk pengenalan di 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);
Konversi ucapan
Teks yang ditafsirkan dari ucapan akan dikirimkan dalam Intent
, yang dikembalikan ketika aktivitas telah selesai dan diakses melalui GetStringArrayListExtra(RecognizerIntent.ExtraResults)
. Ini akan mengembalikan IList<string>
, di mana indeks dapat digunakan dan ditampilkan, tergantung pada jumlah bahasa yang diminta dalam niat pemanggil (dan ditentukan dalam RecognizerIntent.ExtraMaxResults
). Seperti halnya daftar apa pun, ada baiknya memeriksa untuk memastikan bahwa ada data yang akan ditampilkan.
Saat mendengarkan nilai pengembalian , StartActivityForResult
OnActivityResult
metode harus disediakan.
Dalam contoh di bawah ini, textBox
digunakan TextBox
untuk menghasilkan apa yang telah ditentukan. Ini sama-sama dapat digunakan untuk meneruskan teks ke beberapa bentuk interpreter dan dari sana, aplikasi dapat membandingkan teks dan cabang dengan bagian lain dari aplikasi.
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);
}
}
Teks ke Ucapan
Teks ke ucapan tidak cukup kebalikan ucapan ke teks dan bergantung pada dua komponen utama; mesin teks ke ucapan yang diinstal pada perangkat dan bahasa yang diinstal.
Sebagian besar, perangkat Android dilengkapi dengan layanan Google TTS default yang diinstal dan setidaknya satu bahasa. Ini dibuat ketika perangkat pertama kali disiapkan dan akan didasarkan pada di mana perangkat pada saat itu (misalnya, telepon yang disiapkan di Jerman akan menginstal bahasa Jerman, sedangkan satu di Amerika akan memiliki bahasa Inggris Amerika).
Langkah 1 - Membuat Instans TextToSpeech
TextToSpeech
dapat mengambil hingga 3 parameter, dua parameter pertama diperlukan dengan yang ketiga bersifat opsional (AppContext
, IOnInitListener
, engine
). Pendengar digunakan untuk mengikat layanan dan menguji kegagalan dengan mesin menjadi sejumlah teks Android yang tersedia ke mesin ucapan. Minimal, perangkat akan memiliki mesin Google sendiri.
Langkah 2 - Menemukan bahasa yang tersedia
Kelas Java.Util.Locale
berisi metode bermanfaat yang disebut GetAvailableLocales()
. Daftar bahasa yang didukung oleh mesin ucapan ini kemudian dapat diuji terhadap bahasa yang diinstal.
Ini adalah masalah sepele untuk menghasilkan daftar bahasa "dipahami". Akan selalu ada bahasa default (bahasa yang ditetapkan pengguna saat pertama kali mengatur perangkat mereka), jadi dalam contoh List<string>
ini memiliki "Default" sebagai parameter pertama, sisa daftar akan diisi tergantung pada hasil 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();
Kode ini memanggil TextToSpeech.IsLanguageAvailable untuk menguji apakah paket bahasa untuk lokal tertentu sudah ada di perangkat.
Metode ini mengembalikan LanguageAvailableResult, yang menunjukkan apakah bahasa untuk lokal yang diteruskan tersedia. Jika LanguageAvailableResult
menunjukkan bahwa bahasa tersebut adalah NotSupported
, maka tidak ada paket suara yang tersedia (bahkan untuk diunduh) untuk bahasa tersebut. Jika LanguageAvailableResult
diatur ke MissingData
, maka dimungkinkan untuk mengunduh paket bahasa baru seperti yang dijelaskan di bawah ini di Langkah 4.
Langkah 3 - Mengatur kecepatan dan nada
Android memungkinkan pengguna untuk mengubah suara ucapan dengan mengubah SpeechRate
dan Pitch
(laju kecepatan dan nada ucapan). Ini berlangsung dari 0 hingga 1, dengan ucapan "normal" menjadi 1 untuk keduanya.
Langkah 4 - Menguji dan memuat bahasa baru
Mengunduh bahasa baru dilakukan dengan menggunakan Intent
. Hasil dari niat ini menyebabkan metode OnActivityResult dipanggil. Tidak seperti contoh ucapan ke teks (yang menggunakan RecognizerIntent sebagai PutExtra
parameter untuk Intent
), pengujian dan pemuatan Intent
berbasisAction
:
TextToSpeech.Engine.ActionCheckTtsData – Memulai aktivitas dari mesin platform
TextToSpeech
untuk memverifikasi penginstalan dan ketersediaan sumber daya bahasa yang tepat pada perangkat.TextToSpeech.Engine.ActionInstallTtsData – Memulai aktivitas yang meminta pengguna untuk mengunduh bahasa yang diperlukan.
Contoh kode berikut mengilustrasikan cara menggunakan tindakan ini untuk menguji sumber daya bahasa dan mengunduh bahasa baru:
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
pengujian untuk ketersediaan sumber daya bahasa. OnActivityResult
dipanggil ketika pengujian ini selesai. Jika sumber daya bahasa perlu diunduh, OnActivityResult
aktifkan TextToSpeech.Engine.ActionInstallTtsData
tindakan untuk memulai aktivitas yang memungkinkan pengguna mengunduh bahasa yang diperlukan. Perhatikan bahwa implementasi ini OnActivityResult
tidak memeriksa Result
kode karena, dalam contoh yang disederhanakan ini, penentuan telah dibuat bahwa paket bahasa perlu diunduh.
Tindakan ini TextToSpeech.Engine.ActionInstallTtsData
menyebabkan aktivitas data suara Google TTS disajikan kepada pengguna karena memilih bahasa yang akan diunduh:
Sebagai contoh, pengguna mungkin memilih Bahasa Prancis dan mengklik ikon unduh untuk mengunduh data suara Prancis:
Penginstalan data ini terjadi secara otomatis setelah pengunduhan selesai.
Langkah 5 - IOnInitListener
Agar aktivitas dapat mengonversi teks menjadi ucapan, metode OnInit
antarmuka harus diimplementasikan (ini adalah parameter kedua yang ditentukan untuk instansiasi TextToSpeech
kelas). Ini menginisialisasi pendengar dan menguji hasilnya.
Pendengar harus menguji untuk dan OperationResult.Success
OperationResult.Failure
minimal.
Contoh berikut menunjukkan hanya bahwa:
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);
}
Ringkasan
Dalam panduan ini kita telah melihat dasar-dasar mengonversi teks ke ucapan dan ucapan ke teks dan metode yang mungkin tentang cara menyertakannya dalam aplikasi Anda sendiri. Meskipun tidak mencakup setiap kasus tertentu, Anda sekarang harus memiliki pemahaman dasar tentang bagaimana ucapan ditafsirkan, cara menginstal bahasa baru, dan cara meningkatkan inklusivitas aplikasi Anda.