Kotlin ile Dialogflow kullanarak Sesli Asistan yapımı
Merhabalar, bu yazımda size Kotlin ile Dialogflow platformu kullanarak basit bir asistan uygulamasını aşama aşama gerçekleştirilmesinden bahsedeceğim.
Dialogflow Nedir?
Google’ın 2016 sonlarına doğru bünyesine kattığı (eski adıyla Api.ai) şirket , kullanıcılara AI tarafından ses ve konuşma arayüzleri ile birden fazla cihaz için chatbot geliştirmek için kullanılan platformdur.
Dialogflowu daha iyi anlamak için bileşenlerini tanıyalım.
Agent
Kullanıcıların girdilerine uygun yanıtı döndürmek amacıya yapılandırılmış verileri işleminize yardımcı olur.
Agent’ın 3 farklı bileşenden oluşur.
- Eğitim cümleleri : Kullanıcıların söyleceği örnek ifadeleri tanımlar. Dialogflow bu ifadeleri kullanır ve eşleşen bir modeli oluşturmak için benzer ifadelerle genişletir.
- Eylem ve Paremetreler : (Bu bileşen intent maddesinde açıklamış olacağız.)
- Yanıtlar
Intent
Intent, kullanıcının söylediklerine karşılık gelen eşleşmeyi temsil eder. Amaçlarımıza göre farklı intentler oluşturabilirsiniz.
Daha iyi açıklamak gerekirse ; bu bileşende farklı tipte sorularımızı oluşturup, bu sorulara karşılık gelecek cevapları oluşturduğumuz yerdir.
Fulfillment
Fulfillment, sorduğumuz sorumuzun cevabının herhangi bir web servisimizden dönmesi için gerekli işlemlerin yapıldığı yerdir.
Biraz da olsa bileşenlerden fikir sahibi olduğumuza göre projeye aşama aşama yapılışına geçelim.
Geliştirme Aşamaları
Geliştireceğimiz projenin senaryosu :
Kullanıcı : Merhaba/Hey/Selam
Asistan : Hoşgeldin! sana nasıl yardımcı olabilirim?Kullanıcı : Sen Kimsin?/ Hakkında Bilgi verir misin? / Kendini açıklar mısın?
Asistan : Adım asistan. 1 haftalığım. Türkiye sınırları içerisinde bana herhangi bir ilin adını söylersen sana hava durumunu öğrenmen de yardımcı olacağım :)Kullanıcı : Bursa'da hava nasıl? / Bursa nasıl? / Bursa -- (Bursa yerine başka illerde söylenebilecek.)
Asistan : Bursa'da hava 8 derece parçalı bulutlu.
1. Yeni agent (projemizi) oluşturmak
İlk olarak https://console.dialogflow.com/api-client/ girip agentımızı oluşturuyoruz.
2. Intent Oluşturmak
Agent oluşturduktan sonra, senaryomuzu belirleyip hangi sorularda asistanımızın hangi cevapları vereceğini belirliyoruz.
Intent -> Create Intent yolunu izleyip yeni intentimizi oluşturuyoruz.
Daha sonra sorularımızı ve cevaplarımızı belirleyip kaydediyoruz. Görüldüğü üzere de aynı cevapları alacağımız soruları girdim ve bir tane cevap belirledim.
3. Sorumuzun cevabının web servisten dönmesi
Bu aşama tamamen opsiyonel. İsterseniz web servis kullanmadan sadece intentler oluşturup da yapabilirsiniz.
Fullfilment’ı seçip; inline editörden veya kendi oluşturacağımız webservisten cevapların alınmasını sağlayabiliriz.
Ben webhookta kullandığım ve güncel hava durumunu çektiğim api için http://api.apixu.com yararlandım. Kodlarına adresinden ulaşabilirsiniz.
Daha sonra , yeni oluşturduğumuz intent ile hangi sorulardan sonra web servisten veri döneceğini belirliyoruz.
Burada önemli olan kısım; Bursa(değişken) kısmını seçili yapıp ona key atamak. Ben geo-city keyini atamışım. Bu keye göre de servisim de gerekli işlemleri yapıyorum. Webhook için daha ayrıntılı bilgiye adresinden ulaşabilirsiniz.
4. Kotlin ile Dialogflow platformunun entegre edilmesi
app -> build.gradle yolunu izleyip dialogflow ve java client v2 kütüphanelerini ekliyoruz.
Java Client v2, dialogflow için java istemcisidir. (v1 sürümünü de kullabilirsiniz ama v1 kullanacaklara 23 Ekim 2019 tarihinde v1 sürümünün kullanımdan kalkacağını hatırlatma fayda var.)
Java Client kütüphanesini kullanmamız için bizden Google IAM console dan oluşturacağımız json istemekte. Bu jsonu oluşturmak için,
İlk önce IAM console da oluşturduğumuz projenin içine giriyoruz.
Önce düzenleye tıkladıktan sonra Yeni anahtar oluştur diyoruz.
Json olarak oluşturuyoruz. Oluşturduktan sonra otomatik olarak bilgisayarımıza iniyor. Bu dosyayı uygulamamızın içinde raw dizini oluşturup inen .json dosyamızı raw içerisine koyuyoruz.
Activity’miz içerisinde oluşturduğumuz json dosyamızı okuyarak, clientımızı tanımlıyoruz.
Daha sonra yazacağımız mesajın Dialogflow ile bağlantı kurmasını sağlayacak sınıfımızı oluşturuyoruz.
Geri dönen mesajı ise Activity’imizde onResult fonksiyonumuzda işliyoruz.
5. TextToSpeech ve SpeechToText özelliğinin entegre edilmesi
6. Mesajların okunması ve Layouta eklenmesi
RequestTask sınıfımızdan geri dönen değeri Activity’imizde onResult fonksiyonun da işliyoruz demiştik. onResult fonksiyonumuz daki response değerini layoutumuza ekliyoruz.
Eğer kullanıcı tipi BOT ise bu kullanıcıyı TextToSpeech işlemini yaptırıyoruz.
Uygulama
Projenin github linki
Dialogflow ile sesli asistan yapımını elimden geldiği kadarıyla anlatmaya çalıştım. Umarım başarılı olmuşumdur 🙂
Projenin sonraki aşamalarında Google Asisstant, Slack entegrelerini yapıp daha komplike hale getirmeyi hedefliyorum. Bu entegreleri tamamladıktan sonra yeni yazılar ile görüşmek üzere 🙂