Pengenalan Ucapan di Xamarin.iOS
Artikel ini menyajikan Speech API baru dan menunjukkan cara mengimplementasikannya di aplikasi Xamarin.iOS untuk mendukung pengenalan ucapan berkelanjutan dan mentranskripsikan ucapan (dari streaming audio langsung atau yang direkam) ke dalam teks.
Baru menggunakan iOS 10, Apple telah merilis API Pengenalan Ucapan yang memungkinkan aplikasi iOS mendukung pengenalan ucapan berkelanjutan dan mentranskripsikan ucapan (dari streaming audio langsung atau yang direkam) ke dalam teks.
Menurut Apple, API Pengenalan Ucapan memiliki fitur dan manfaat berikut:
- Sangat Akurat
- Negara Seni
- Mudah Digunakan
- Cepat
- Mendukung Beberapa Bahasa
- Menghormati Privasi Pengguna
Cara Kerja Pengenalan Ucapan
Pengenalan Ucapan diimplementasikan dalam aplikasi iOS dengan memperoleh audio langsung atau yang telah direkam sebelumnya (dalam salah satu bahasa lisan yang didukung API) dan meneruskannya ke Speech Recognizer yang mengembalikan transkripsi teks biasa dari kata yang diucapkan.
Dikte Keyboard
Ketika sebagian besar pengguna memikirkan Pengenalan Ucapan pada perangkat iOS, mereka memikirkan asisten suara Siri bawaan, yang dirilis bersama dengan Dikte Keyboard di iOS 5 dengan iPhone 4S.
Dikte Keyboard didukung oleh elemen antarmuka apa pun yang mendukung TextKit (seperti UITextField
atau UITextArea
) dan diaktifkan oleh pengguna yang mengklik Tombol Dikte (langsung di sebelah kiri bilah spasi) di keyboard virtual iOS.
Apple telah merilis statistik Dikte Keyboard berikut (dikumpulkan sejak 2011):
- Dikte Keyboard telah banyak digunakan sejak dirilis di iOS 5.
- Sekitar 65.000 aplikasi menggunakannya per hari.
- Sekitar sepertiga dari semua Dikte iOS dilakukan di aplikasi pihak ke-3.
Dikte Keyboard sangat mudah digunakan karena tidak memerlukan upaya pada bagian pengembang, selain menggunakan elemen antarmuka TextKit dalam desain UI aplikasi. Dikte Keyboard juga memiliki keuntungan tidak memerlukan permintaan hak istimewa khusus dari aplikasi sebelum dapat digunakan.
Aplikasi yang menggunakan API Pengenalan Ucapan baru akan memerlukan izin khusus untuk diberikan oleh pengguna, karena pengenalan ucapan memerlukan transmisi dan penyimpanan sementara data di server Apple. Silakan lihat dokumentasi Peningkatan Keamanan dan Privasi kami untuk detailnya.
Meskipun Dikte Keyboard mudah diimplementasikan, itu datang dengan beberapa keterbatasan dan kerugian:
- Ini memerlukan penggunaan Bidang Input Teks dan tampilan keyboard.
- Ini hanya berfungsi dengan input audio langsung dan aplikasi tidak memiliki kontrol atas proses perekaman audio.
- Ini tidak memberikan kontrol atas bahasa yang digunakan untuk menafsirkan ucapan pengguna.
- Tidak ada cara bagi aplikasi untuk mengetahui apakah tombol Dikte bahkan tersedia untuk pengguna.
- Aplikasi tidak dapat menyesuaikan proses perekaman audio.
- Ini memberikan serangkaian hasil yang sangat dangkal yang tidak memiliki informasi seperti waktu dan keyakinan.
API Pengenalan Ucapan
Baru menggunakan iOS 10, Apple telah merilis API Pengenalan Ucapan yang menyediakan cara yang lebih kuat bagi aplikasi iOS untuk menerapkan pengenalan ucapan. API ini sama dengan yang digunakan Apple untuk mendukung Siri dan Dikte Keyboard dan mampu memberikan transkripsi cepat dengan status akurasi seni.
Hasil yang disediakan oleh SPEECH Recognition API disesuaikan secara transparan dengan masing-masing pengguna, tanpa aplikasi harus mengumpulkan atau mengakses data pengguna privat apa pun.
API Pengenalan Ucapan memberikan hasil kembali ke aplikasi panggilan mendekati real-time saat pengguna berbicara dan memberikan informasi lebih lanjut tentang hasil terjemahan daripada hanya teks. Ini termasuk:
- Beberapa interpretasi dari apa yang dikatakan pengguna.
- Tingkat keyakinan untuk terjemahan individu.
- Informasi waktu.
Seperti yang dinyatakan di atas, audio untuk terjemahan dapat disediakan baik oleh umpan langsung, atau dari sumber yang telah direkam sebelumnya dan dalam salah satu dari lebih dari 50 bahasa dan dialek yang didukung oleh iOS 10.
API Pengenalan Ucapan dapat digunakan pada perangkat iOS apa pun yang menjalankan iOS 10 dan dalam kebanyakan kasus, memerlukan koneksi internet langsung karena sebagian besar terjemahan berlangsung di server Apple. Meskipun demikian, beberapa perangkat iOS yang lebih baru mendukung terjemahan bahasa tertentu yang selalu aktif di perangkat.
Apple telah menyertakan AVAILABILITY API untuk menentukan apakah bahasa tertentu tersedia untuk diterjemahkan saat ini. Aplikasi harus menggunakan API ini alih-alih menguji konektivitas internet itu sendiri secara langsung.
Seperti disebutkan di atas di bagian Dikte Keyboard, pengenalan ucapan memerlukan transmisi dan penyimpanan sementara data di server Apple melalui internet, dan dengan demikian, aplikasi harus meminta izin pengguna untuk melakukan pengenalan dengan menyertakan NSSpeechRecognitionUsageDescription
kunci dalam filenya Info.plist
dan memanggil SFSpeechRecognizer.RequestAuthorization
metode .
Berdasarkan sumber audio yang digunakan untuk Pengenalan Ucapan, perubahan lain pada file aplikasi Info.plist
mungkin diperlukan. Silakan lihat dokumentasi Peningkatan Keamanan dan Privasi kami untuk detailnya.
Mengadopsi Pengenalan Ucapan di Aplikasi
Ada empat langkah utama yang harus dilakukan pengembang untuk mengadopsi pengenalan ucapan di aplikasi iOS:
- Berikan deskripsi penggunaan dalam file aplikasi
Info.plist
menggunakanNSSpeechRecognitionUsageDescription
kunci . Misalnya, aplikasi kamera mungkin menyertakan deskripsi berikut, "Ini memungkinkan Anda untuk mengambil foto hanya dengan mengucapkan kata 'keju'." - Minta otorisasi dengan memanggil
SFSpeechRecognizer.RequestAuthorization
metode untuk menyajikan penjelasan (disediakan dalam kunci diNSSpeechRecognitionUsageDescription
atas) tentang mengapa aplikasi ingin akses pengenalan ucapan ke pengguna dalam kotak dialog dan memungkinkan mereka untuk menerima atau menolak. - Buat Permintaan Pengenalan Ucapan:
- Untuk audio yang telah direkam sebelumnya pada disk, gunakan
SFSpeechURLRecognitionRequest
kelas . - Untuk audio langsung (atau audio dari memori), gunakan
SFSPeechAudioBufferRecognitionRequest
kelas .
- Untuk audio yang telah direkam sebelumnya pada disk, gunakan
- Teruskan Permintaan Pengenalan Ucapan ke Pengenal Ucapan (
SFSpeechRecognizer
) untuk memulai pengenalan. Aplikasi ini dapat secara opsional menahan yang dikembalikanSFSpeechRecognitionTask
untuk memantau dan melacak hasil pengenalan.
Langkah-langkah ini akan dibahas secara rinci di bawah ini.
Memberikan Deskripsi Penggunaan
Untuk memberikan kunci yang diperlukan NSSpeechRecognitionUsageDescription
dalam Info.plist
file, lakukan hal berikut:
Klik dua kali
Info.plist
file untuk membukanya untuk pengeditan.Beralih ke tampilan Sumber :
Klik Tambahkan Entri Baru, masukkan
NSSpeechRecognitionUsageDescription
untuk Properti,String
untuk Jenis dan Deskripsi Penggunaan sebagai Nilai. Contohnya:Jika aplikasi akan menangani transkripsi audio langsung, aplikasi juga akan memerlukan Deskripsi Penggunaan Mikrofon. Klik Tambahkan Entri Baru, masukkan
NSMicrophoneUsageDescription
untuk Properti,String
untuk Jenis dan Deskripsi Penggunaan sebagai Nilai. Contohnya:Simpan perubahan pada file.
Penting
Gagal menyediakan salah satu kunci di atas Info.plist
(NSSpeechRecognitionUsageDescription
atau NSMicrophoneUsageDescription
) dapat mengakibatkan aplikasi gagal tanpa peringatan saat mencoba mengakses Pengenalan Ucapan atau mikrofon untuk audio langsung.
Meminta Otorisasi
Untuk meminta otorisasi pengguna yang diperlukan yang memungkinkan aplikasi mengakses pengenalan ucapan, edit kelas View Controller utama dan tambahkan kode berikut:
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;
}
});
}
}
}
Metode RequestAuthorization
SFSpeechRecognizer
kelas akan meminta izin dari pengguna untuk mengakses pengenalan ucapan menggunakan alasan yang disediakan pengembang dalam NSSpeechRecognitionUsageDescription
kunci Info.plist
file.
SFSpeechRecognizerAuthorizationStatus
Hasilnya dikembalikan ke RequestAuthorization
rutinitas panggilan balik metode yang dapat digunakan untuk mengambil tindakan berdasarkan izin pengguna.
Penting
Apple menyarankan untuk menunggu hingga pengguna memulai tindakan di app yang memerlukan pengenalan ucapan sebelum meminta izin ini.
Mengenali Ucapan yang Telah Direkam Sebelumnya
Jika aplikasi ingin mengenali ucapan dari file WAV atau MP3 yang telah direkam sebelumnya, aplikasi dapat menggunakan kode berikut:
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);
}
}
});
}
Melihat kode ini secara rinci, pertama, ia mencoba membuat Speech Recognizer (SFSpeechRecognizer
). Jika bahasa default tidak didukung untuk pengenalan ucapan, null
dikembalikan dan fungsi keluar.
Jika Speech Recognizer tersedia untuk bahasa default, aplikasi memeriksa untuk melihat apakah saat ini tersedia untuk pengenalan menggunakan Available
properti . Misalnya, pengenalan mungkin tidak tersedia jika perangkat tidak memiliki koneksi internet aktif.
SFSpeechUrlRecognitionRequest
Dibuat dari NSUrl
lokasi file yang telah direkam sebelumnya di perangkat iOS dan diserahkan ke Speech Recognizer untuk diproses dengan rutinitas panggilan balik.
Ketika panggilan balik dipanggil, jika NSError
tidak null
ada kesalahan yang harus ditangani. Karena pengenalan ucapan dilakukan secara bertahap, rutinitas panggilan balik dapat dipanggil lebih dari sekali sehingga SFSpeechRecognitionResult.Final
properti diuji untuk melihat apakah terjemahan selesai dan versi terjemahan terbaik ditulis (BestTranscription
).
Mengenali Live Speech
Jika aplikasi ingin mengenali ucapan langsung, prosesnya sangat mirip dengan mengenali ucapan yang telah direkam sebelumnya. Contohnya:
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 ();
}
Melihat kode ini secara rinci, kode ini membuat beberapa variabel privat untuk menangani proses pengenalan:
private AVAudioEngine AudioEngine = new AVAudioEngine ();
private SFSpeechRecognizer SpeechRecognizer = new SFSpeechRecognizer ();
private SFSpeechAudioBufferRecognitionRequest LiveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest ();
private SFSpeechRecognitionTask RecognitionTask;
Ini menggunakan AV Foundation untuk merekam audio yang akan diteruskan ke SFSpeechAudioBufferRecognitionRequest
untuk menangani permintaan pengenalan:
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);
});
Aplikasi mencoba untuk mulai merekam dan kesalahan apa pun ditangani jika rekaman tidak dapat dimulai:
AudioEngine.Prepare ();
NSError error;
AudioEngine.StartAndReturnError (out error);
// Did recording start?
if (error != null) {
// Handle error and return
...
return;
}
Tugas pengenalan dimulai dan handel disimpan ke Tugas Pengenalan (SFSpeechRecognitionTask
):
RecognitionTask = SpeechRecognizer.GetRecognitionTask (LiveSpeechRequest, (SFSpeechRecognitionResult result, NSError err) => {
...
});
Panggilan balik digunakan dengan cara yang mirip dengan yang digunakan di atas pada ucapan yang telah direkam sebelumnya.
Jika perekaman dihentikan oleh pengguna, Baik Mesin Audio maupun Permintaan Pengenalan Ucapan akan diinformasikan:
AudioEngine.Stop ();
LiveSpeechRequest.EndAudio ();
Jika pengguna membatalkan pengenalan, maka Tugas Mesin Audio dan Pengenalan akan diberi tahu:
AudioEngine.Stop ();
RecognitionTask.Cancel ();
Penting untuk memanggil RecognitionTask.Cancel
jika pengguna membatalkan terjemahan untuk membebaskan memori dan prosesor perangkat.
Penting
Gagal menyediakan NSSpeechRecognitionUsageDescription
kunci atau NSMicrophoneUsageDescription
Info.plist
dapat mengakibatkan aplikasi gagal tanpa peringatan saat mencoba mengakses Pengenalan Ucapan atau mikrofon untuk audio langsung (var node = AudioEngine.InputNode;
). Silakan lihat bagian Memberikan Deskripsi Penggunaan di atas untuk informasi selengkapnya.
Batas Pengenalan Ucapan
Apple memberlakukan batasan berikut saat bekerja dengan Pengenalan Ucapan di aplikasi iOS:
- Pengenalan Ucapan gratis untuk semua aplikasi, tetapi penggunaannya tidak terbatas:
- Perangkat iOS individual memiliki sejumlah pengenalan terbatas yang dapat dilakukan per hari.
- Aplikasi akan dibatasi secara global berdasarkan permintaan per hari.
- Aplikasi harus disiapkan untuk menangani koneksi jaringan Pengenalan Ucapan dan kegagalan batas laju penggunaan.
- Pengenalan Ucapan dapat memiliki biaya tinggi dalam pengosongan baterai dan lalu lintas jaringan yang tinggi pada perangkat iOS pengguna, karena itu, Apple memberlakukan batas durasi audio yang ketat sekitar satu menit maks ucapan.
Jika aplikasi secara rutin mencapai batas pembatasan lajunya, Apple meminta pengembang menghubungi mereka.
Pertimbangan Privasi dan Kegunaan
Apple memiliki saran berikut untuk transparan dan menghormati privasi pengguna saat menyertakan Pengenalan Ucapan di aplikasi iOS:
- Saat merekam ucapan pengguna, pastikan untuk dengan jelas menunjukkan bahwa rekaman sedang berlangsung di Antarmuka Pengguna aplikasi. Misalnya, aplikasi mungkin memutar suara "merekam" dan menampilkan indikator perekaman.
- Jangan gunakan Pengenalan Ucapan untuk informasi pengguna sensitif seperti kata sandi, data kesehatan, atau informasi keuangan.
- Tampilkan hasil pengenalan sebelum bertindak pada mereka. Ini tidak hanya memberikan umpan balik tentang apa yang dilakukan aplikasi, tetapi memungkinkan pengguna untuk menangani kesalahan pengenalan saat dibuat.
Ringkasan
Artikel ini telah menyajikan Speech API baru dan menunjukkan cara mengimplementasikannya di aplikasi Xamarin.iOS untuk mendukung pengenalan ucapan berkelanjutan dan mentranskripsikan ucapan (dari streaming audio langsung atau yang direkam) ke dalam teks.