Menggunakan contoh Habitica (aplikasi open source untuk memperbaiki kebiasaan dan mencapai tujuan, yang ditulis di Kotlin), Vitala Gorbachev, arsitek solusi di Just AI, menunjukkan cara mengintegrasikan antarmuka suara dengan cepat dan mulus ke dalam fungsionalitas aplikasi apa pun.

Tapi pertama-tama, mari kita bahas mengapa kontrol suara aplikasi seluler itu nyaman? Mari kita mulai dengan yang sudah jelas.
- Kita sering kali perlu menggunakan aplikasi ini saat tangan kita sibuk: memasak, mengemudi, membawa koper, saat mengerjakan pekerjaan mekanik, dan sebagainya.
- Suara adalah alat penting bagi orang-orang tunanetra.
Kasingnya sudah transparan, tetapi pada kenyataannya semuanya bahkan lebih sederhana: dalam beberapa kasus, panggilan dengan suara lebih cepat ! Bayangkan - memesan tiket pesawat dengan satu kalimat "Belikan saya tiket besok untuk dua orang ke Samara" alih-alih mengisi formulir yang panjang. Pada saat yang sama, dengan kemampuan untuk mengajukan pertanyaan klarifikasi kepada pengguna: di malam atau sore hari? dengan atau tanpa bagasi?
Suara tersebut berguna saat kita melalui skenario "pengisian formulir" dan nyaman untuk mengisi hampir semua formulir panjang yang memerlukan sejumlah informasi dari pengguna. Dan formulir seperti itu ada di sebagian besar aplikasi seluler.
Dari kiri ke kanan: Aplikasi Prigorod RZD, buku harian makanan FatSecret (pengguna harus mengisi formulir beberapa kali sehari, memilih dari ratusan produk), aplikasi roti Korzhov.
Karena fakta bahwa asisten suara saat ini sering diperkenalkan ke dalam obrolan dukungan dan mereka berkembang dari sana, sebagian besar perusahaan mencoba mendorong fungsionalitas aplikasi ke dalam obrolan. Tambah saldo, cari tahu sesuatu tentang produk atau layanan ... Ini tidak selalu mudah diterapkan, dan dalam kasus masukan suara, ini benar-benar kontraproduktif, jika hanya karena pengenalan ucapan sering tidak berfungsi dengan sempurna.
Pendekatan yang benar adalah dengan mengintegrasikan asisten secara mulus ke dalam fungsionalitas aplikasi yang ada, di antarmuka yang formulirnya akan diisi, sehingga orang tersebut dapat dengan mudah memeriksa bahwa dia mengatakan semuanya dengan benar dan klik OK.Kami memutuskan untuk menunjukkan bagaimana hal ini dapat dilakukan dengan menggunakan contoh Habitica - ini adalah aplikasi sumber terbuka yang ditulis di Kotlin yang hampir murni. "Habitika" sangat cocok untuk kasus dengan asisten suara - di sini juga, untuk memulai tugas baru, Anda perlu mengisi formulir yang agak banyak. Mari kita coba mengganti proses yang membosankan ini dengan satu frase dengan pertanyaan yang mengarahkan?
Saya telah membagi tutorial menjadi dua bagian. Pada artikel ini, kami akan mencari cara untuk menambahkan asisten suara ke aplikasi seluler dan menerapkan skenario dasar (dalam kasus kami, ini adalah skenario siap pakai untuk mengklarifikasi ramalan cuaca dan waktu - salah satu permintaan asisten suara paling populer di dunia). Di artikel kedua - dan akan segera dirilis - kita akan belajar cara memanggil layar tertentu dengan suara dan mengimplementasikan kueri kompleks di dalam aplikasi.
Apa yang Anda butuhkan untuk bekerja
SDK. Kami menggunakan Aimybox sebagai SDK untuk membangun antarmuka dialog. Di luar kotak, Aimybox menyediakan asisten SDK dan UI yang singkat dan dapat disesuaikan (yang dapat diubah jika diinginkan). Pada saat yang sama , Anda dapat memilih dari yang sudah ada atau membuat modul Anda sendiri sebagai mesin untuk pengenalan , sintesis , dan NLP .
Pada dasarnya, Aimybox mengimplementasikan arsitektur asisten suara, menstandarkan antarmuka semua modul ini dan mengatur interaksinya dengan cara yang benar. Jadi, dengan mengimplementasikan solusi ini, Anda dapat mengurangi waktu secara signifikan untuk mengembangkan antarmuka suara dalam aplikasi Anda. Anda dapat membaca lebih lanjut tentang Aimybox di sini ataudisini .
Alat pembuatan skrip. Kami akan menulis skrip dalam JAICF (ini adalah kerangka kerja open source dan gratis untuk mengembangkan aplikasi suara dari Just AI), dan kami akan mengenali maksud menggunakan Caila (layanan NLU) di JAICP (Just AI Conversational Platform). Saya akan memberi tahu Anda lebih banyak tentang mereka di bagian selanjutnya dari tutorial - ketika kita mulai menggunakannya.
Smartphone. Untuk pengujian, kami membutuhkan smartphone Android, tempat kami akan menjalankan dan menguji Habitika.
Prosedur
Pertama, kita bercabang "Habitika" (cabang rilis) dan mencari file yang paling penting bagi kita. Saya menggunakan Android Studio IDE:
Find MainActivity .kt - kami akan menyematkan logika di sana.
HabiticaBaseApplication .kt - di sana kami akan menginisialisasi Aimybox.
Activity_main .xml - menyematkan elemen antarmuka di sana.
AndroidManifest .xml - seluruh struktur aplikasi dan izinnya disimpan di sana.
Menurut petunjuk di lobak Habitiki, ganti nama habitica.properties.example dan habitica.resources.example, hapus contoh dari mereka, mulai proyek di firebase untuk aplikasi dan salin file google-services.json ke root.
Kami meluncurkan aplikasi untuk memeriksa apakah perakitan berfungsi. Voila!
Pertama, mari tambahkan dependensi Aimybox.
implementation 'com.justai.aimybox:core:0.11.0'
implementation("com.justai.aimybox:components:0.1.8")
dalam dependensi dan
maven { url 'https://dl.bintray.com/aimybox/aimybox-android-sdk/' }
maven { url "https://dl.bintray.com/aimybox/aimybox-android-assistant/" }
di repositori.
Dan tambahkan baris berikut tepat setelah compileOptions agar semuanya bekerja dengan benar
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
Sekarang izin.
Hapus tanda dari izin RECORD_AUDIO dan MODIFY_AUDIO_SETTINGS di AndroidManifest .xml sehingga opsinya terlihat seperti ini.
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
Sekarang mari kita inisialisasi Aimybox di BaseApplication.
Tambahkan AimyboxProvider saat menginisialisasi kelas.
Dan kami melakukan inisialisasi yang sebenarnya.
private fun createAimybox (context: Context): Aimybox {
val unitId = UUID.randomUUID().toString()
val textToSpeech = GooglePlatformTextToSpeech(context, Locale("Ru"))
val speechToText = GooglePlatformSpeechToText(context, Locale("Ru"))
val dialogApi = AimyboxDialogApi(
"YOUR KEY", unitId)
return Aimybox(Config.create(speechToText, textToSpeech, dialogApi))
}
Alih-alih YOUR_KEY, kode Anda dari Konsol Aimybox selanjutnya akan menjadi.
Sekarang kami menyematkan cuplikan di mainActivity.kt. Pra-sisipkan FrameLayout di activity_main.xml, tepat di bawah frameLayout dengan id bottom_navigation
<FrameLayout
android:id="@+id/assistant_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Di MainActivity itu sendiri, pertama-tama tambahkan permintaan izin eksplisit ke OnCreate
ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.RECORD_AUDIO), 1)
Dan saat Anda menerimanya, tambahkan fragmen ke bingkai di atas.
@SuppressLint("MissingPermission")
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
val fragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.add(R.id.assistant_container, AimyboxAssistantFragment())
fragmentTransaction.commit()
}
Jangan lupa untuk menambahkan ke OnBackPressed kemampuan untuk keluar dari asisten setelah memasukkannya.
val assistantFragment = (supportFragmentManager.findFragmentById(R.id.assistant_container)
as? AimyboxAssistantFragment)
if (assistantFragment?.onBackPressed() != true) {
return
}
Selain itu, tambahkan gaya (styles.xml) di AppTheme
<item name="aimybox_assistantButtonTheme">@style/CustomAssistantButtonTheme</item>
<item name="aimybox_recognitionTheme">@style/CustomRecognitionWidgetTheme</item>
<item name="aimybox_responseTheme">@style/CustomResponseWidgetTheme</item>
<item name="aimybox_imageReplyTheme">@style/CustomImageReplyWidgetTheme</item>
<item name="aimybox_buttonReplyTheme">@style/CustomButtonReplyWidgetTheme</item>
Dan gaya individual ada tepat di bawah ini:
<style name="CustomAssistantButtonTheme" parent="DefaultAssistantTheme.AssistantButton">
</style>
<style name="CustomRecognitionWidgetTheme" parent="DefaultAssistantTheme.Widget.Recognition">
</style>
<style name="CustomResponseWidgetTheme" parent="DefaultAssistantTheme.Widget.Response">
</style>
<style name="CustomButtonReplyWidgetTheme" parent="DefaultAssistantTheme.Widget.ButtonReply">
</style>
<style name="CustomImageReplyWidgetTheme" parent="DefaultAssistantTheme.Widget.ImageReply">
</style>
Mari kita periksa apakah mikrofon telah ditambahkan. Kami meluncurkan aplikasi.
Kami mendapat banyak kesalahan tentang sintaks yang salah. Kami memperbaiki semuanya sesuai saran IDE.
Kerja!
Tapi mikrofon merayap ke navigasi bawah. Mari kita tingkatkan sedikit. Tambahkan ke gaya di atas di CustomAssistantButtonTheme:
<item name="aimybox_buttonMarginBottom">72dp</item>
Lebih baik!
Sekarang mari hubungkan asisten di sana dan periksa apakah dia menjawab dengan normal. Untuk ini kita membutuhkan konsol Aimybox.
Mari kita mulai dengan membuka app.aimybox.com di bawah akun github kami, membuat proyek baru, menghubungkan beberapa keterampilan (saya menghubungkan DateTime untuk ujian) dan mencoba mengajukan pertanyaan yang sesuai di asisten. Di sini, di pengaturan, di sudut kanan atas, kami mengambil apiKey, yang kami masukkan ke createAimybox, bukan KUNCI ANDA.
private fun createAimybox (context: Context): Aimybox {
val unitId = UUID.randomUUID().toString()
val textToSpeech = GooglePlatformTextToSpeech(context)
val speechToText = GooglePlatformSpeechToText(context)
val dialogApi = AimyboxDialogApi(
"YOUR KEY", unitId)
return Aimybox(Config.create(speechToText, textToSpeech, dialogApi))
}
Kerja!
Hanya teks bahasa Inggris, mari ubah pesan selamat datang di strings.constants.xml.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Prefs -->
<string name="SP_userID" translatable="false">UserID</string>
<string name="SP_APIToken" translatable="false">APIToken</string>
<string name="base_url" translatable="false">https://habitica.com</string>
<string name="initial_phrase">"! ?</string>
Hore!
Berikut ini tautan ke repositori kode.
Dalam artikel berikutnya tentang asisten "Habitika", saya akan memberi tahu Anda cara menggunakan suara Anda tidak hanya untuk mengetahui cuaca, tetapi untuk mengontrol aplikasi secara langsung - untuk menavigasi halaman dan menambahkan kebiasaan dan tugas.