Bagikan melalui


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.

Cara Kerja Pengenalan Ucapan

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 menggunakan NSSpeechRecognitionUsageDescription 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 di NSSpeechRecognitionUsageDescription 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 .
  • Teruskan Permintaan Pengenalan Ucapan ke Pengenal Ucapan (SFSpeechRecognizer) untuk memulai pengenalan. Aplikasi ini dapat secara opsional menahan yang dikembalikan SFSpeechRecognitionTask 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:

  1. Klik dua kali Info.plist file untuk membukanya untuk pengeditan.

  2. Beralih ke tampilan Sumber :

    Tampilan Sumber

  3. Klik Tambahkan Entri Baru, masukkan NSSpeechRecognitionUsageDescription untuk Properti, String untuk Jenis dan Deskripsi Penggunaan sebagai Nilai. Contohnya:

    Menambahkan NSSpeechRecognitionUsageDescription

  4. 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:

    Menambahkan NSMicrophoneUsageDescription

  5. 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.