Uygulama geliştirme

Bir Sesli Etkileşim Uygulaması'nı (VIA) uygulamak için aşağıdaki adımları tamamlamanız gerekir:

  1. VIA iskeleti oluşturun.
  2. (isteğe bağlı) Kurulum/oturum açma akışı uygulayın.
  3. (isteğe bağlı) Bir Ayarlar ekranı uygulayın.
  4. Manifest dosyasında gerekli izinleri beyan edin.
  5. Ses plakası kullanıcı arayüzü ekleyin.
  6. Ses tanıma uygulayın (RecognitionService API uygulamasını içermelidir).
  7. İfadeyi uygulayın (isteğe bağlı olarak TextToSpeech API'yi uygulayabilirsiniz).
  8. 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şleterek VoiceInteractionService.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:

Yaşam döngüleri

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

Bildirim hatırlatıcı

Şekil 2. Bildirim hatırlatıcı

Bu akış şu şekilde işler:

Bildirim hatırlatma akışı

Ş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:

  1. Kullanıcıyı bu durum hakkında sözlü olarak bilgilendirmek (örneğin, birkaç adımı tamamlamanız gerekiyor ... ").
  2. 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.
  3. 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

Ayar entegrasyonu

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.

İzin iste

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:

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.

Ses plakası gösteriliyor

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ıl
  • VoiceInteractionSession#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:

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:

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: