Bir Sesli Etkileşim Uygulaması'nı (VIA) uygulamak için aşağıdaki adımları tamamlamanız gerekir:
- VIA iskeleti oluşturun.
- (isteğe bağlı) Kurulum/oturum açma akışı uygulayın.
- (isteğe bağlı) Bir Ayarlar ekranı uygulayın.
- Manifest dosyasında gerekli izinleri beyan edin.
- Ses plakası kullanıcı arayüzü ekleyin.
- Ses tanıma uygulayın (RecognitionService API uygulamasını içermelidir).
- İfadeyi uygulayın (isteğe bağlı olarak TextToSpeech API'yi uygulayabilirsiniz).
- Komutları yerine getirme işlemini uygulayın. Bu içeriği şurada görün: Komutları Yerine Getirme.
Aşağıdaki bölümlerde, yukarıda bahsedilen her bir adımın nasıl tamamlanacağı açıklanmaktadır.
VIA iskeleti oluşturma
Manifestler
Aşağıdaki durumlarda bir uygulama Sesli Etkileşim'e sahip olarak algılanır: şunu içerir:
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myvoicecontrol"> ... <application ... > <service android:name=".MyInteractionService" android:label="@string/app_name" android:permission="android.permission.BIND_VOICE_INTERACTION" android:process=":interactor"> <meta-data android:name="android.voice_interaction" android:resource="@xml/interaction_service" /> <intent-filter> <action android:name= "android.service.voice.VoiceInteractionService" /> </intent-filter> </service> </application> </manifest>
Bu örnekte:
- VIA'lar,
VoiceInteractionService
kapsamını genişleterekVoiceInteractionService.SERVICE_INTERFACE ("android.service.voice.VoiceInteractionService")
işlemi için bir intent filtresi. - Bu hizmet,
BIND_VOICE_INTERACTION
sistem imza iznine sahip olmalıdır. - Bu hizmet bir
android.voice_interaction
meta veri dosyası içermelidir şunları içermelidir:res/xml/interaction_service.xml
<voice-interaction-service xmlns:android="http://schemas.android.com/apk/res/android" android:sessionService= "com.example.MyInteractionSessionService" android:recognitionService= "com.example.MyRecognitionService" android:settingsActivity= "com.example.MySettingsActivity" android:supportsAssist="true" android:supportsLaunchVoiceAssistFromKeyguard="true" android:supportsLocalInteraction="true" />
Her alanla ilgili ayrıntılar için bkz. R.styleable#VoiceInteractionService
.
Tüm VIA'ların aynı zamanda ses tanıma hizmeti olması nedeniyle,
manifest dosyanıza aşağıdakileri ekleyin:
AndroidManifest.xml
<manifest ...> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <application ...> ... <service android:name=".RecognitionService" ...> <intent-filter> <action android:name="android.speech.RecognitionService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.speech" android:resource="@xml/recognition_service" /> </service> </application> </manifest>
Ses tanıma hizmetleri için aşağıdaki meta veriler de gereklidir:
res/xml/recognition_service.xml
<recognition-service xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.example.MyRecognizerSettingsActivity" />
VoiceEtkileşimHizmeti, VoiceEngagementSessionService ve VoiceEngagementSession
Aşağıdaki şemada, bu varlıkların her birinin yaşam döngüsü gösterilmektedir:
Şekil 1. Yaşam döngüleri
Daha önce belirtildiği gibi, VoiceInteractionService
giriş noktasıdır
VIA'ya. Bu hizmetin ana sorumlulukları şunlardır:
- Uzun süre boyunca çalışmaya devam etmesi gereken işlemleri bu VIA etkin VIA. Örneğin, özel kelime algılama.
- Desteklenen sesli işlemleri bildirir (bkz. Sesli Asistan Dokundur ve Oku).
- Kilit ekranından (tuş koruyucu) sesli etkileşim oturumları başlat.
En basit biçimiyle, bir VoiceEngagementService uygulaması aşağıdaki gibidir:
public class MyVoiceInteractionService extends VoiceInteractionService { private static final List<String> SUPPORTED_VOICE_ACTIONS = Arrays.asList( CarVoiceInteractionSession.VOICE_ACTION_READ_NOTIFICATION, CarVoiceInteractionSession.VOICE_ACTION_REPLY_NOTIFICATION, CarVoiceInteractionSession.VOICE_ACTION_HANDLE_EXCEPTION ); @Override public void onReady() { super.onReady(); // TODO: Setup hotword detector } @NonNull @Override public Set<String> onGetSupportedVoiceActions( @NonNull Set<String> voiceActions) { Set<String> result = new HashSet<>(voiceActions); result.retainAll(SUPPORTED_VOICE_ACTIONS); return result; } ... }
VoiceInteractionService#onGetSupportedVoiceActions()
kullanımı
gereken
Sesli Asistan Dokundur ve Oku'ya dokunun.
VoiceEngagementSessionService ise sistem tarafından
VoiceEngagementSession ile etkileşimde bulunmalıdır. Projenin tek bir sorumluluğu vardır,
yeni oturum başlatabilirsiniz.
public class MyVoiceInteractionSessionService extends VoiceInteractionSessionService { @Override public VoiceInteractionSession onNewSession(Bundle args) { return new MyVoiceInteractionSession(this); } }
Son olarak, VoiceEngagementSession etkinliğinde
düşünmesi gerekir. Tek bir oturum örneği, birden fazla oturumu tamamlamak için yeniden kullanılabilir
kullanıcı etkileşimleri. AAOS'de bir yardımcı CarVoiceInteractionSession
vardır,
benzersiz otomotiv işlevlerinden bazılarının uygulanmasına yardımcı oluyor.
public class MyVoiceInteractionSession extends CarVoiceInteractionSession { public InteractionSession(Context context) { super(context); } @Override protected void onShow(String action, Bundle args, int showFlags) { closeSystemDialogs(); // TODO: Unhide UI and update UI state // TODO: Start processing audio input } ... }
VoiceInteractionSession
, birçok farklı geri çağırma yöntemine sahip
aşağıdaki bölümlerde açıklanmıştır. Tam liste VoiceInteractionSession
için dokümanlara bakın.
Kurulum/oturum açma akışı uygulama
Kurulum ve oturum açma işlemleri şu şekilde gerçekleşebilir:
- Cihaz ilk katılım sırasında (Kurulum Sihirbazı).
- Sesli etkileşim hizmeti değiştirilirken (Ayarlar).
- Uygulama seçildiğinde ilk başlatıldıktan sonra.
Önerilen kullanıcı deneyimi ve görsel rehberlik hakkında ayrıntılar için Önceden Yüklenmiş Asistanlar: Kullanıcı Deneyimi Yönergeleri.
Ses hizmeti değiştirilirken kurulum
Kullanıcının doğru şekilde değiştirilmemiş bir VIA seçmesi her zaman mümkündür. yapılandırıldı. Bunun nedeni şunlar olabilir:
- Kullanıcı, Kurulum Sihirbazı'nı tamamen veya kullanıcı sesi atladı yapılandırma adımına geçin.
- Kullanıcı, cihaz sırasında yapılandırılandan farklı bir VIA seçti ilk katılım.
Her koşulda, VoiceInteractionService
, kullanıcıları teşvik edecek çeşitli yöntemler sunar.
kurulumu tamamlamak için:
- Bildirim hatırlatıcı.
- Kullanıcı kullanmaya çalıştığında otomatik sesli yanıt.
Not: VIA kurulum akışının sunulması önerilmez. . Bu, VIA'ların otomatik olarak cihaz önyüklemesi sırasında HU'da içerik görüntülemesi ya da bir kullanıcı değiştirme veya kilidi açın.
Bildirim hatırlatıcı
Bildirim hatırlatıcısı, kurulum gerektiğini belirtmek için rahatsız edici olmayan bir yöntemdir. ve kullanıcıların asistan kurulumuna gitmelerini sağlamak için akışı sağlar.
Şekil 2. Bildirim hatırlatıcı
Bu akış şu şekilde işler:
Şekil 3. Bildirim hatırlatma akışı
Sesli yanıt
Bu, uygulanması en basit akıştır ve süreçle ilgili
kullanıcıya ne olduğunu açıklayan bir VoiceInteractionSession#onShow()
yapılmalı ve ardından kullanıcılara sorulmalı (Kullanıcı Deneyimi Kısıtlaması durumunda kuruluma izin verilip verilmediğini)
kurulum akışını başlatmak istiyorlar. O anda kurulum yapılamıyorsa bunu açıklayın
durum da olabilir.
İlk kullanımda kur
Kullanıcının doğru şekilde eşlenmemiş bir VIA'yı tetiklemesi her zaman mümkündür. yapılandırıldı. Böyle durumlarda:
- Kullanıcıyı bu durum hakkında sözlü olarak bilgilendirmek (örneğin, birkaç adımı tamamlamanız gerekiyor ... ").
- Kullanıcı deneyimi kısıtlamaları motoru izin veriyorsa (bkz. UX_RESTRICTIONS_NO_Kurulum), kullanıcıya VIA için kurulum işlemini gerçekleştirin ve ardından Ayarlar ekranını açın.
- Aksi takdirde (örneğin, kullanıcı araba kullanıyorsa) kullanıcıya bir bildirim bırakın. güvenli olduğunda ilgili seçeneği tıklamaktır.
Sesli etkileşim kurulum ekranları oluşturma
Kurulum ve oturum açma ekranları normal etkinlikler olarak geliştirilmelidir. Bkz. Kullanıcı arayüzü geliştirmeyle ilgili kullanıcı deneyimi ve görsel yönergeler Önceden Yüklenmiş Asistanlar: Kullanıcı Deneyimi Yönergeleri.
Genel kurallar:
- VIA'lar, kullanıcıların diledikleri zaman kuruluma devam etmelerine ve kuruluma devam etmelerine olanak tanımalıdır.
UX_RESTRICTIONS_NO_SETUP
kısıtlaması varsa kuruluma izin verilmemelidir. Ayrıntılar için bkz. Sürücü Dikkatini Dağıtma Kuralları.- Kurulum ekranları her aracın tasarım sistemine uygun olmalıdır. Genel ekran düzen, simgeler, renkler ve diğer yönler kullanıcı arayüzünün geri kalanıyla tutarlı olmalıdır. Görüntüleyin Özelleştirme inceleyebilirsiniz.
Ayarlar ekranını uygulayın
4.Şekil Ayar entegrasyonu
Ayar ekranları normal Android etkinlikleridir. Uygulandığında giriş noktası
res/xml/interaction_service.xml
içinde, VIA'nın bir parçası olarak beyan edilmelidir.
manifest dosyaları (bkz.
Manifestler) tıklayın.
Ayarlar bölümü, kuruluma ve oturum açma işlemine devam etmek için iyi bir yerdir (kullanıcı işlemi tamamlamadıysa
veya gerekirse oturumu kapatma veya kullanıcı değiştir seçeneği sunun. Kuruluma benzer
bu ekranlar:
- Ekran grubunda önceki ekrana geri dönme seçeneği sunun (örneğin, Araba Ayarları).
- Sürüş sırasında izin verilmez. Ayrıntılı bilgi için Sürücü Dikkatini Dağıtma Yönergeleri'ni inceleyin.
- Her araç tasarım sistemini eşleştirin. Ayrıntılar için bkz. Özelleştirme.
Manifest dosyasında gerekli izinleri beyan edin
VIA için gereken izinler üç kategoriye ayrılabilir:
- Sistem imza izinleri. Bunlar, izinler Yalnızca önceden yüklenmiş, sistem tarafından imzalanmış APK'lara verilir. Kullanıcılar izin veremez Bu izinleri yalnızca OEM'ler sistem görüntülerini oluştururken verebilir. İmza izinleri alma hakkında daha fazla bilgi için Sisteme Özel İzinler Verme başlıklı makaleye göz atın.
- Tehlikeli izinler. Bunlar, kullanıcının alması gereken izinler izin vermek için İzinlerController iletişim kutusunu kullanabilirsiniz. OEM'ler bunlardan bazıları için önceden izin verebilir varsayılan VoiceEtkileşim Hizmeti'ne yönelik izinler. Ancak bu varsayılan ayar Cihazdan cihaza değişebilir, uygulamalar bunları isteyebilir izin verebilirsiniz.
- Diğer izinler. Bunlar, ekibinizin Bu reklamların kullanıcı müdahalesi gerektirmemesidir. Bu izinler otomatik olarak verilir sistem tarafından belirlenir.
Yukarıdaki göz önünde bulundurulduğunda, aşağıdaki bölümde yalnızca tehlikeli izinler. İzinler yalnızca kullanıcı şu durumdayken istenmelidir: kontrol edebilirsiniz.
Uygulama, çalışması için gereken izinlere sahip değilse durumu, karşınızdaki kişiye söyleyerek durumu açıklayan kullanıcının, ayrıca kullanıcının ve VIA ayarları ekranlarına geri dönün. Ayrıntılar için bkz. 1. Bildirim hatırlatıcı.
Ayar ekranının bir parçası olarak izin isteme
Tehlikeli izinler normal ActivityCompat#requestPermission()
yöntemi (veya eşdeğeri) kullanılarak istenir. İzin istemeyle ilgili ayrıntılar için bkz.
Uygulama İzinleri İsteyin.
5. Şekil. İzin iste
Bildirim dinleyici izni
TTR akışını uygulamak için VIA'ların bildirim dinleyicidir. Bu, aslında bir izin değil, kayıtlı kullanıcılara bildirim göndermesine izin veren yapılandırma yardımcı olur. VIA'ya bu bilgilere erişim izni verilip verilmediğini öğrenmek için uygulamalar:
- (İsteğe bağlı) Aşağıdaki kodu kullanarak önceden bildirim dinleyicileri olup olmadığını kontrol edin:
CarAssistUtils#assistantIsNotificationListener()
Örneğin bu işlem kurulum akışı sırasında yapılabilir. - (Zorunlu)
CarVoiceInteractionSession#onShow()
talimatıyla ilgili tepki verinVOICE_ACTION_HANDLE_EXCEPTION
veEXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING
istisnası.
Bu erişim önceden verilmediyse VIA, kullanıcıyı Araba Ayarları'nın Bildirim Erişimi bölümü (ifadelerin bir kombinasyonunu kullanarak) ve bildirimler. Aşağıdaki kod, ayarlar uygulaması:
private void requestNotificationListenerAccess() { Intent intent = new Intent(Settings .ACTION_NOTIFICATION_LISTENER_SETTINGS); intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName()); startActivity(intent); }
Ses plakası kullanıcı arayüzü ekleme
Bir VoiceInteractionSession
, onShow()
geri çağırması aldığında,
bir ses plakası kullanıcı arayüzü gösterebilir. Ses plakasının uygulanmasıyla ilgili görsel ve kullanıcı deneyimi yönergeleri için
Önceden Yüklenmiş Asistanlar: Kullanıcı Deneyimi Yönergeleri.
6. Şekil. Ses plakası gösteriliyor
Bu kullanıcı arayüzünün uygulanmasına ilişkin iki seçenek vardır:
VoiceInteractionSession#onCreateContentView()
ayarını geçersiz kılVoiceInteractionSession#startAssistantActivity()
kullanarak etkinlik başlatın
onCreateContentView() işlevini kullanma
Bu, varsayılan olarak ses plakasını gösterme yöntemidir. VoiceInteractionSession
temel sınıf, bir pencere oluşturur ve bu pencerenin yaşam döngüsünü, bir ses
devam ediyor. Uygulamalar, VoiceInteractionSession#onCreateContentView()
politikasını geçersiz kılmalıdır
ve oturum açıldığı anda bu pencereye ekli bir görünüm döndürülür
oluşturuldu. Bu görünüm başlangıçta görünmez olmalıdır. Sesli etkileşim başladığında
bu görünüm VoiceInteractionSession#onShow()
adresinde görünür yapılmalıdır
ve ardından VoiceInteractionSession#onHide()
tarihinde tekrar görünmez.
public class MyVoiceInteractionSession extends CarVoiceInteractionSession { private View mVoicePlate; … @Override public View onCreateContentView() { mVoicePlate = inflater.inflate(R.layout.voice_plate, null); … } @Override protected void onShow(String action, Bundle args, int showFlags) { // TODO: Update UI state to "listening" mVoicePlate.setVisibility(View.VISIBLE); } @Override public void onHide() { mVoicePlate.setVisibility(View.GONE); } … }
Bu yöntemi kullanırken VoiceInteractionSession#onComputeInsets()
değerini ayarlamak isteyebilirsiniz.
belirsizliklerini dikkate almanızı öneririz.
startAssistantActivity() işlevini kullanma
Bu durumda, sesi yönetme yetkisi VoiceInteractionSession
adlı kullanıcıya yetki verir
plaka kullanıcı arayüzünde düzenli bir aktiviteye geçelim. Bu seçenek kullanıldığında, bir VoiceInteractionSession
uygulanması, onPrepareShow()
üzerinde varsayılan içerik penceresinin oluşturulmasını (bkz. onCreateContentView() öğesini kullanma) devre dışı bırakmalıdır
geri arama. Saat VoiceInteractionSession#onShow()
olduğunda oturumda ses başlatılır
VoiceInteractionSession#startAssistantActivity()
ile plaka aktivitesi. Bu
yöntemi, kullanıcı arayüzünü uygun pencere ayarları ve etkinlik bayraklarıyla başlatır.
public class MyVoiceInteractionSession extends CarVoiceInteractionSession { … @Override public void onPrepareShow(Bundle args, int showFlags) { super.onPrepareShow(args, showFlags); setUiEnabled(false); } @Override protected void onShow(String action, Bundle args, int showFlags) { closeSystemDialogs(); Intent intent = new Intent(getContext(), VoicePlateActivity.class); intent.putExtra(VoicePlateActivity.EXTRA_ACTION, action); intent.putExtra(VoicePlateActivity.EXTRA_ARGS, args); startAssistantActivity(intent); } … }
Bu etkinlik ile
VoiceInteractionSession
, bir dizi dahili Amaç veya hizmet bağlama
gereklidir. Örneğin, VoiceInteractionSession#onHide()
çağrıldığında
oturumun bu isteği etkinliğe geçirebilmesi gerekir.
Önemli. Otomotiv'de yalnızca özel olarak açıklamalı
UXR "izin verilenler listesi"nde listelenen etkinlikler veya etkinlikler çalışırken
araba kullanma hakkında da konuştuk. Bu,
VoiceInteractionSession#startAssistantActivity()
da ekleyebilirsiniz. Şunu yapmayı unutmayın:
etkinliğinize <meta-data
android:name="distractionOptimized" android:value="true"/>
ile not ekleyin veya bunu ekleyin
/packages/services/Car/service/res/values/config.xml
kodunun systemActivityWhitelist
anahtarındaki etkinlik
dosyası olarak kaydedebilirsiniz. Daha fazla bilgi için bkz. Sürücü
Dikkat Dağılması Kuralları'na gidin.
Ses tanımayı uygulayın
Bu bölümde, ses tanıma ve ses tanıma özellikleri aracılığıyla tanımaya yardımcı oluyor. Özel kelime, yeni bir sorgu başlatmak için kullanılan tetikleyici kelimedir veya sesle işlem yapabilirsiniz. Örneğin, "Ok Google" veya "Ok Google" deyin.
DSP özel kelime algılama
Android, DSP düzeyinde her zaman açık bir özel kelime algılayıcısına
AlwaysOnHotwordDetector
anlamına gelir.
özel kelime algılamayı uygulamanın bir yoludur. Bu işlevin kullanımı,
şu iki bölüme ayrılır:
AlwaysOnHotwordDetector
örneğinin oluşturulması.- Özel kelime algılama ses modelinin kaydı.
VoiceEngagementService uygulaması aşağıdakileri kullanarak bir özel kelime dedektörü oluşturabilir:
VoiceInteractionService#createAlwaysOnHotwordDetector()
,
algılamak için kullanmak istedikleri anahtar kelimeyi ve yerel ayarı iletin. Sonuç olarak
Uygulama bir onAvailabilityChanged()
alır
aşağıdaki olası değerlerden biriyle geri çağırma yapın:
STATE_HARDWARE_UNAVAILABLE
DSP özelliği olanak tanır. Bu durumda, Yazılım özel kelime algılama kullanılır.STATE_HARDWARE_UNSUPPORTED
TTP desteği genel olarak mevcut değildir ancak TTP, belirtilen anahtar kelime öbeği ve yerel ayar kombinasyonunu desteklemiyor. Uygulama, Yazılım Özel Kelime Algılama.STATE_HARDWARE_ENROLLED
Popüler kelime algılama özelliği hazır ve şu kullanıcı tarafından başlatılabilir:startRecognition()
yöntemini çağırın.STATE_HARDWARE_UNENROLLED
İstenen anahtar kelime öbeği için ses modeli değil kullanılabilir ancak kaydolabilirsiniz.
Özel kelime algılama ses modellerinin kaydı, IVoiceInteractionManagerService#updateKeyphraseSoundModel()
kullanılarak yapılabilir.
Sisteme belirli bir zamanda birden çok model kaydedilebilir, ancak bu modellerden yalnızca bir tanesi
model bir AlwaysOnHotwordDetector
ile ilişkilendirilmiş.
DSP özel kelime algılama özelliği tüm cihazlarda kullanılamayabilir. Geliştiriciler aracılığıyla
getDspModuleProperties()
kullanarak donanım özelliklerini kontrol etmeli
yöntemidir. Gösterilen örnek kod için
Ses modellerini kaydetme hakkında bilgi için VoiceEnrollment/src/com/android/test/voiceenrollment/EnrollmentUtil.java
sayfasına bakın.
Şunlarla ilgili Eş zamanlı yakalama bölümüne göz atın:
eş zamanlı özel kelime tanıma.
Yazılım özel kelime algılama
Yukarıda belirtildiği gibi DSP özel kelime algılama, tüm cihazlar (örneğin, Android emülatörü DSP emülasyonu sağlamaz). Böyle durumlarda yazılım ses tanıma ise tek alternatifidir. Diğer kullanıcıların mikrofona erişmesi gereken uygulamalar için VIA'ların ses girişine aşağıdakileri kullanarak erişmesi gerekir:
- Ses yakalama için MediaRecorder.AudioSource.HOTWORD kullanılmalıdır.
android.Manifest.permission.CAPTURE_AUDIO_HOTWORD
iznini tutun.
Bu sabit değerlerin her ikisi de @hide
ve yalnızca paket halinde sunulan uygulamalar tarafından kullanılabilir.
Ses girişini ve ses tanımayı yönetin
Ses girişi, MediaRecorder sınıfı kullanılarak uygulanır.
Bu API'nin nasıl kullanılacağı hakkında daha fazla bilgi için bkz. MediaRecorder
Genel Bakış. Sesli etkileşim hizmetlerinin de RecognitionService
olması beklenir
sınıf uygulamaları. Sistemde ses tanıma gerektiren her uygulama
sahip olmanız gerekir. Ses tanıma işlemi yapmak ve mikrofona erişmek için VIA'lar
android.permission.RECORD_AUDIO
değerini içermeli.
Bir RecognitionService
cihazına erişen uygulamalar
uygulamasında da bu iznin bulunması beklenir.
Android 10'dan önce tek seferde yalnızca bir uygulamaya mikrofon erişimi veriliyordu (özel kelime algılama hariç, yukarıya bakın). Android 10 sürümünden itibaren mikrofon erişimi paylaşılabilir. Daha fazla bilgi için bkz. Paylaşım Ses Girişi.
Ses çıkışına erişim
VIA sözlü yanıtlar vermeye hazır olduğunda uygulayın:
- Uygulama, ses odağı isteğinde bulunurken veya ses çıkışını yönetirken
ses özellikleri olarak
AudioAttributes#USAGE_ASSISTANT
veAudioAttributes#CONTENT_TYPE_SPEECH
kullanılmalıdır. - Konuşma tanıma sırasında,
AudioManage#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE
ile ses odağı istenmelidir. Bazı medya uygulamalarının medya komutlarına düzgün tepki vermeyebileceğini unutmayın (bkz. Fulfilling Media Commands) odak kaldırılır.