Saya menggunakan Google Home setiap saat untuk memeriksa cuaca sebelum meninggalkan rumah, mengatur alarm, mendengarkan musik, tetapi saya tidak pernah mempertimbangkan untuk menulis aplikasi bagi Google Home. Apa yang dibutuhkan untuk menulis sebuah aplikasi bagi asisten Google Home? Dan bisakah kita membuatnya lebih pintar dengan memanfaatkan Google Cloud? Itu adalah pertanyaan yang rekan saya Chris Bacon, dan saya pikirkan ketika kami memutuskan untuk mem-build demo bagi ceramah konferensi.

Naluri awal saya adalah bahwa mem-build aplikasi untuk Google Home akan cukup rumit. Lagi pula, kita berbicara tentang manusia nyata yang berbicara dengan perangkat yang memicu beberapa layanan berjalan di cloud. Ada banyak detail yang harus diperhitungkan dan banyak hal yang berpotensi bisa berjalan ke arah yang salah.

Ternyata, ini jauh lebih mudah daripada yang saya pikir dan sangat menyenangkan juga. Dalam postingan ini, saya ingin memberi Anda sekilas tentang apa yang kami build. Bila Anda ingin menyiapkan dan menjalankan demo ini sendiri, petunjuk dan kodenya dihosting di GitHub.

Ringkasan

Tujuan utama kami dengan aplikasi ini adalah untuk menampilkan library .NET Google Cloud dengan cara yang menyenangkan dan menarik sembari menyoroti kekuatan unik Google. Setelah melakukan brainstorming, kami memutuskan untuk mem-build aplikasi berbasis suara menggunakan Dialogflow, di mana kami menanyakan beberapa pertanyaan acak dan membiarkan Google Home menjawab dengan memanfaatkan kekuatan cloud.

Di aplikasi kami, Anda bisa meminta Google Home untuk menelusuri gambar kota. Setelah menemukan gambarnya, mereka akan ditampilkan di frontend web. Anda bisa memilih sebuah gambar dan mengajukan lebih banyak pertanyaan seperti “Can you describe the image?” atau “Does the image contain landmarks?” Anda juga bisa mengajukan pertanyaan tentang suhu global seperti “What was the hottest temperature in France in 2015?” Atau tentang Hacker News, misalnya “What was the top Hacker News story on May 1, 2018?” Sebuah gambar bernilai seribu kata. Beginilah bagaimana aplikasi terlihat di tingkat tinggi.

Pertama kali, perintah suara direkam oleh perangkat Google Home dan diteruskan ke Asisten Google. Kami menggunakan Dialogflow untuk menangani masukan ke Asisten Google. Beberapa masukan ditangani secara langsung di Dialogflow dan beberapa diteruskan ke webhook eksternal yang telah ditetapkan sebelumnya (dalam hal ini, endpoint HTTPS yang berjalan di Google Cloud).

Saya juga harus menyebutkan bahwa aplikasi ini bekerja di mana pun selama Asisten Google didukung dan Anda login di akun Google yang sama seperti ketika Anda membuat aplikasi Dialogflow. Bila Anda tidak memiliki Google Home, Anda bisa menggunakan ponsel yang mendukung Asisten Google untuk berinteraksi dengan aplikasi.

Mari kita lihat penerapannya secara lebih detail.

Dialogflow

Dialogflow adalah platform developer untuk mem-build pengalaman percakapan yang alami dan kaya. Ketika kami mulai memikirkan implementasi ini, kami dengan cepat menyadari bahwa Dialogflow akan menjadi titik awal yang baik untuk bagian aplikasi yang dikendalikan oleh suara. Ada beberapa edisi Dialogflow (standar dan enterprise) dengan batasan dan SLA yang berbeda. Untuk demo kami, edisi standar lebih dari cukup.

Anda mulai dengan membuat agent bagi aplikasi Anda di konsol Dialogflow. Di dalam agent, Anda membuat intent. Intent merepresentasikan mapping antara yang dikatakan pengguna dan aksi yang harus dilakukan oleh aplikasi Anda. Anda tidak perlu mencantumkan semua frasa yang bisa memicu intent tertentu. Sebagai gantinya, Anda menyediakan beberapa frasa training dan Dialogflow akan menggunakan machine learning untuk mempelajari frasa yang diharapkan. Ia juga bisa mengambil entity dari frasa tersebut seperti nama kota atau tanggal. Bila aplikasi membutuhkan sebuah entity, Dialogflow akan memastikan bahwa pengguna menyediakannya. Semua fitur kecil ini sangat mempermudah pekerjaan dalam membuat aplikasi percakapan.

Beberapa intent bisa ditangani secara langsung dalam Dialogflow; cukup sediakan respons teks yang perlu dikatakan Dialogflow. Di aplikasi kami, Anda bisa mengucapkan “Say hi to everyone,” yang akan ditanggapi langsung Dialogflow dengan respons sederhana.

Anda juga bisa mengaktifkan endpoint eksternal untuk menangani intent melalui webhook. Ketika intent terpicu, Dialogflow meneruskan permintaan ke endpoint yang ditentukan. Satu-satunya persyaratan adalah bahwa endpoint mendukung HTTPS. Di sinilah kekuatan cloud masuk. Di aplikasi kami, kami menjadi host sebuah endpoint di Google Cloud untuk menangani pertanyaan yang lebih rumit tentang gambar atau suhu global.

ASP.NET Core di App Engine (Flex)

Untuk endpoint, kami memutuskan untuk menjadi host apl web ASP.NET Core yang ter-container di Google Cloud Platform (GCP). Karena ini adalah container yang berjalan di Linux (ya, .NET berjalan di Linux!), kita bisa menjadi host di Google Kubernetes Engine atau App Engine. Kami memutuskan untuk menggunakan App Engine, karena menyediakan endpoint HTTPS secara default dengan tingkat kesulitan paling rendah. Ia juga memberikan kita penetapan versi, sehingga kita bisa menjadi host beberapa versi endpoint untuk melakukan A/B testing atau rollback yang mudah.

Apl web menyediakan dua tujuan. Pertama, frontend visual untuk menampilkan gambar atau pertanyaan (ditangani oleh HomeController). Kedua, menangani panggilan webhook dari Dialogflow untuk pertanyaan yang lebih rumit mengenai gambar atau suhu global (ditangani oleh ConversationController).

ConversationController melimpahkan ke DialogflowApp untuk menangani permintaan. DialogflowApp mengambil id sesi permintaan dan membuat Conversation baru atau menemukan yang sudah ada. Kemudian, Conversation mengambil nama intent dan mencocokkannya dengan subclass BaseHandler menggunakan IntentAttribute pada awal class penangan.

Penelusuran gambar

Ketika pengguna mengucapkan “Search for images of Paris”, itu akan memicu intent “vision.search” yang diaktifkan webhook di Dialogflow. Intent ini mengambil “Paris” sebagai entity dan meneruskannya ke webhook sebagai istilah penelusuran. Panggilan ini kemudian dialihkan ke VisionSearchHandler yang berjalan di App Engine. Class ini menggunakan API Google Penelusuran Khusus untuk menelusuri gambar menggunakan istilah penelusuran. Pada akhirnya, Anda akan melihat daftar gambar di frontend web aplikasi.

Vision API

Setelah memiliki daftar gambar, Anda bisa mengucapkan “Select first picture” untuk memilih salah satu. Sekarang ini mulai menarik. Misalnya, mengucapkan sesuatu seperti “Describe the image” akan memicu VisionDescribeHandler, yang membuat panggilan ke Vision API menggunakan library .NET Vision API kami, dan mendapatkan label kembali. Kita meneruskan label kembali ke Dialogflow, yang pada gilirannya memberikannya ke Google Home untuk diucapkan dengan keras. Anda juga bisa mengucapkan “Does the image contain landmarks?” yang menggunakan fitur deteksi landmark Vision API (ditangani oleh VisionLandmarksHandler). Anda juga bisa mengucapkan “Is the image safe?” untuk memastikan gambar tidak mengandung gambar yang tidak aman (ditangani oleh VisionSafeHandler).

BigQuery

BigQuery adalah solusi gudang data tanpa server milik Google. Ia memiliki banyak dataset publik yang tersedia bagi siapa saja untuk penelusuran dan analisis. Kami memutuskan untuk menggunakan dua di antaranya: Data Hacker News dan Data Cuaca Global NOAA.

Misalnya, bila Anda mengucapkan “What was the top hacker news on May 1, 2018?” Ia akan diambil oleh intent “bigquery.hackernews” dan akhirnya dialihkan ke BigQueryHackerNewsHandler dengan entity tanggal. Class ini menggunakan library .NET BigQuery untuk menjalankan kueri terhadap Data Hacker News dan mengambil 10 artikel Hacker News teratas pada hari itu.

Sama halnya, bila Anda mengucapkan “What was the hottest temperature in France in 2015?” ini memicu BigQueryNoaaextremeHandler untuk menjalankan kueri terhadap data cuaca global dan menampilkan 10 lokasi dan suhu teratas untuk negara tersebut pada tahun itu di frontend web.

Semua ini dilakukan dengan memindai beberapa gigabyte data dalam beberapa detik dan dimungkinkan oleh infrastruktur paralel BigQuery yang sangat besar.

Logging dan pemantauan

Semua ini menyenangkan, tetapi kami ingin memastikan bahwa kami bisa mempertahankan aplikasi ini sampai seterusnya. Stackdriver adalah fitur logging, pemantauan, pelacakan, dan proses debug milik Google Cloud. Mengaktifkan Stackdriver memerlukan sebuah panggilan API (UseGoogleDiagnostics dalam Program) dan melakukan sedikit perubahan pada Dockerfile. Tiba-tiba, kita mendapat log aplikasi, pelacakan semua panggilan HTTP, pemantauan dan terakhir tetapi tidak kalah pentingnya, kemampuan untuk melakukan proses debug produksi secara langsung.

Dengan Stackdriver Debugger, kita bisa menunjukkan kode kita di GitHub dan kemudian mengambil snapshot dari mana saja di dalam kode. Bahasa yang didukung saat ini adalah Java, Python, Node.js, Go, dan C# (versi alfa). Snapshot bisa diambil pada kode produksi langsung tanpa menghentikan atau menunda aplikasi. Snapshot juga bisa bersyarat, dan memuat variabel lokal dan pelacakan tumpukan, yang sangat berharga untuk proses debug produksi.

Kesimpulan

Dalam pengembangan software, sesuatu yang semestinya mudah biasanya berakhir jauh lebih rumit ketika Anda masuk ke detail. Dalam kasus ini, justru sebaliknya. Dialogflow membuat pengenalan suara dan perutean permintaan di aplikasi Google Home sangat sederhana dan lugas. Kami menerapkan aplikasi ASP.NET Core yang ter-container di App Engine dengan sebuah perintah, dan library .NET Google Cloud untuk Vision API dan BigQuery lugas dan konsisten untuk digunakan.

Yang paling utama, saya sangat senang menulis demo ini bersama Chris! Bila Anda ingin mencobanya sendiri, kode dan petunjuknya tersedia di GitHub.