Uygulama geliştirme

Sesli Etkileşim Uygulaması (VIA) uygulamak için aşağıdaki adımları tamamlayın:

  1. VIA iskeleti oluşturun.
  2. (İsteğe bağlı) Kurulum/oturum açma akışı uygulayın.
  3. (İsteğe bağlı) Ayarlar ekranı uygulayın.
  4. Manifest dosyasında gerekli izinleri beyan edin.
  5. Ses plakası kullanıcı arayüzü uygulayın.
  6. Ses tanımayı uygulayın (RecognitionService API uygulaması dahil olmalıdır).
  7. İfadeyi uygulayın (isteğe bağlı olarak TextToSpeech API'yi uygulayabilirsiniz).
  8. Komut karşılama özelliğini uygulayın. Bu içeriği Fulfilling Commands (Komutları Yerine Getirme) bölümünde bulabilirsiniz.

Aşağıdaki bölümlerde, yukarıda belirtilen adımların nasıl tamamlanacağı açıklanmaktadır.

VIA iskeleti oluşturma

Manifestler

Aşağıdaki bilgiler manifeste dahil edildiğinde bir uygulama, Sesli Etkileşim özelliği olan bir uygulama olarak algılanır:

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 işlevini genişleten bir hizmet sunmalı ve VoiceInteractionService.SERVICE_INTERFACE ("android.service.voice.VoiceInteractionService") işlemi için bir amaç filtresi içermelidir.
  • Bu hizmetin BIND_VOICE_INTERACTION sistem imzası izni olmalıdır.
  • Bu hizmet, aşağıdakileri içeren bir android.voice_interactionmeta veri dosyası 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ılı bilgi için R.styleable#VoiceInteractionService başlıklı makaleyi inceleyin. Tüm VIA'lar aynı zamanda ses tanıma hizmetleri olduğundan manifestinize aşağıdakileri de eklemeniz gerekir:

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 veri de gerekir:

res/xml/recognition_service.xml

<recognition-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:settingsActivity="com.example.MyRecognizerSettingsActivity" />

VoiceInteractionService, VoiceInteractionSessionService ve VoiceInteractionSession

Aşağıdaki şemada bu öğelerin her birinin yaşam döngüsü gösterilmektedir:

Yaşam döngüleri

Şekil 1. Yaşam döngüleri

Daha önce de belirtildiği gibi, VoiceInteractionService, VIA'ya giriş noktasıdır. Bu hizmetin temel sorumlulukları şunlardır:

  • Bu VIA etkin olduğu sürece çalışmaya devam etmesi gereken tüm işlemleri başlatın. Örneğin, özel kelime algılama.
  • Desteklenen sesli işlemleri bildirir (bkz. Sesli Asistan'da Dokunarak Okuma).
  • Kilit ekranından (keyguard) sesli etkileşim oturumları başlatma.

En basit haliyle, VoiceInteractionService uygulaması şu şekilde görünür:

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;
    }
    ...
}

Sesli Asistan'ın dokunarak okuma özelliğini kullanmak için VoiceInteractionService#onGetSupportedVoiceActions()'nın uygulanması gerekir. VoiceInteractionSessionService, sistem tarafından VoiceInteractionSession oluşturmak ve bu oturumla etkileşimde bulunmak için kullanılır. Bu hizmetin tek sorumluluğu, istendiğinde yeni oturumlar başlatmaktır.

public class MyVoiceInteractionSessionService extends VoiceInteractionSessionService {
    @Override
    public VoiceInteractionSession onNewSession(Bundle args) {
        return new MyVoiceInteractionSession(this);
    }
}

Son olarak, işin büyük bir kısmı VoiceInteractionSession'da yapılır. Tek bir oturum örneği, birden fazla kullanıcı etkileşimini tamamlamak için yeniden kullanılabilir. AAOS'te, otomotivlere özgü işlevlerin bir kısmının uygulanmasına yardımcı olan bir yardımcı CarVoiceInteractionSession bulunur.

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, aşağıdaki bölümlerde açıklanan çok sayıda geri çağırma yöntemine sahiptir. Yöntemlerin tam listesi için VoiceInteractionSession dokümanlarına bakın.

Kurulum/oturum açma akışı uygulama

Kurulum ve oturum açma işlemleri şu durumlarda yapılabilir:

  • Cihazın ilk kurulumu sırasında (Kurulum Sihirbazı).
  • Sesli etkileşim sırasında hizmet değiştirme (Ayarlar).
  • Uygulama ilk kez seçildiğinde başlatılır.

Önerilen kullanıcı deneyimi ve görsel rehberlik hakkında ayrıntılı bilgi için Önceden Yüklenmiş Asistanlar: Kullanıcı Deneyimi Rehberi başlıklı makaleyi inceleyin.

Ses hizmeti değiştirilirken kurulum

Kullanıcı, her zaman düzgün şekilde yapılandırılmamış bir VIA seçebilir. Bunun nedeni aşağıdakilerden biri olabilir:

  • Kullanıcı, Kurulum Sihirbazı'nı tamamen atladı veya sesli etkileşim yapılandırma adımını atladı.
  • Kullanıcı, cihazın ilk katılımı sırasında yapılandırılan VIA'dan farklı bir VIA seçti.

Her durumda, VoiceInteractionService, kullanıcının kurulumu tamamlamasını teşvik etmek için çeşitli yöntemler kullanabilir:

  • Bildirim hatırlatıcısı.
  • Kullanıcı özelliği kullanmaya çalıştığında otomatik sesli yanıt.

Not: Açık bir kullanıcı isteği olmadan VIA kurulum akışı sunmanız kesinlikle önerilmez. Bu nedenle, VIAs'lar cihaz başlatılırken veya kullanıcı geçişi ya da cihaz kilidinin açılması sonucunda HU'da içeriği otomatik olarak göstermemelidir.

Bildirim hatırlatıcısı

Bildirim hatırlatıcısı, kurulum ihtiyacını belirtmenin ve kullanıcılara asistan kurulum akışına gitme olanağı sunmanın rahatsız etmeyen bir yoludur.

Bildirim hatırlatıcısı

Şekil 2. Bildirim hatırlatıcısı

Bu akışın işleyiş şekli:

Bildirim hatırlatma akışı

Şekil 3. Bildirim hatırlatma akışı

Sesli yanıt

Bu, uygulanması en basit akıştır. VoiceInteractionSession#onShow() geri çağırmasında bir ifade başlatılır, kullanıcıya ne yapılması gerektiği açıklanır ve ardından (kullanıcı deneyimi kısıtlama durumu kurulumun yapılmasına izin veriyorsa) kurulum akışını başlatmak isteyip istemediği sorulur. Kurulum o sırada mümkün değilse bu durumu da açıklayın.

İlk kullanımda kurulum

Kullanıcının, düzgün şekilde yapılandırılmamış bir VIA'yı tetiklemesi her zaman mümkündür. Bu gibi durumlarda:

  1. Kullanıcıyı bu durum hakkında sözlü olarak bilgilendirin (örneğin, "Düzgün çalışabilmem için birkaç adımı tamamlamanız gerekiyor… ").
  2. Kullanıcı deneyimi kısıtlamaları motoru izin veriyorsa (UX_RESTRICTIONS_NO_SETUP bölümüne bakın) kullanıcıya kurulum sürecini başlatmak isteyip istemediğini sorun ve ardından VIA için Ayarlar ekranını açın.
  3. Aksi takdirde (örneğin, kullanıcı araç kullanıyorsa) kullanıcıya, güvenli olduğunda seçeneği tıklaması için bildirim bırakın.

Sesli etkileşim kurulum ekranları oluşturma

Kurulum ve oturum açma ekranları normal etkinlikler olarak geliştirilmelidir. Önceden Yüklenmiş Asistanlar: Kullanıcı Deneyimi Rehberliği bölümündeki kullanıcı arayüzü geliştirme ile ilgili kullanıcı deneyimi ve görsel yönergelere bakın.

Genel yönergeler:

  • VIA'lar, kullanıcıların kurulumu istedikleri zaman durdurup devam ettirmelerine olanak tanımalıdır.
  • UX_RESTRICTIONS_NO_SETUP kısıtlaması etkinken kuruluma izin verilmemelidir. Ayrıntılar için Sürücü Dikkatini Dağıtma Yönergeleri başlıklı makaleyi inceleyin.
  • Kurulum ekranları, her araç için tasarım sistemiyle eşleşmelidir. Genel ekran düzeni, simgeler, renkler ve diğer yönler, kullanıcı arayüzünün geri kalanıyla tutarlı olmalıdır. Ayrıntılar için Özelleştirme bölümünü inceleyin.

Ayarlar ekranı uygulama

Ayarlar entegrasyonu

Şekil 4. Ayarlar entegrasyonu

Ayarlar ekranları normal Android etkinlikleridir. Uygulanırsa giriş noktaları, VIA manifestlerinin bir parçası olarak res/xml/interaction_service.xml içinde beyan edilmelidir (bkz. Manifestler). Ayarlar bölümü, kurulum ve oturum açma işlemine devam etmek (kullanıcı işlemi tamamlamadıysa) veya gerekirse oturumu kapatma ya da kullanıcı değiştirme seçeneği sunmak için iyi bir yerdir. Yukarıda açıklanan kurulum ekranlarına benzer şekilde bu ekranlar:

  • Ekran yığınında önceki ekrana (ör. Araç Ayarları) dönme seçeneği sunun.
  • Sürüş sırasında kullanılmasına izin verilmez. Ayrıntılar için Sürücü Dikkatini Dağıtma Yönergeleri başlıklı makaleyi inceleyin.
  • Her bir araç tasarım sistemini eşleştirin. Ayrıntılar için Özelleştirme bölümünü inceleyin.

Manifest dosyasında gerekli izinleri bildirin

VIA'nın gerektirdiği izinler üç kategoriye ayrılabilir:

  • Sistem imzası izinleri. Bunlar yalnızca önceden yüklenmiş, sistem tarafından imzalanmış APK'lara verilen izinlerdir. Kullanıcılar bu izinleri veremez. Yalnızca OEM'ler sistem görüntülerini oluştururken bu izinleri verebilir. İmza izinleri alma hakkında daha fazla bilgi için Sisteme ayrıcalıklı izinler verme başlıklı makaleyi inceleyin.
  • Tehlikeli izinler. Bunlar, kullanıcının PermissionsController iletişim kutusunu kullanarak vermesi gereken izinlerdir. OEM'ler, bu izinlerden bazılarını varsayılan VoiceInteractionService'e önceden verebilir. Ancak bu varsayılan değer cihazdan cihaza değişebileceğinden uygulamalar gerektiğinde bu izinleri isteyebilmelidir.
  • Diğer izinler. Bunlar, kullanıcı müdahalesi gerektirmeyen diğer tüm izinlerdir. Bu izinler sistem tarafından otomatik olarak verilir.

Yukarıda belirtilenler göz önüne alındığında, aşağıdaki bölümde yalnızca tehlikeli izinler istenmesi ele alınmaktadır. İzinler yalnızca kullanıcı oturum açma veya ayar ekranlarındayken istenmelidir.

Uygulamanın çalışması için gerekli izinler yoksa kullanıcıya durumu açıklamak için sesli ifade kullanılması ve kullanıcının VIA ayarları ekranlarına geri dönmek için kullanabileceği bir fırsat sunmak üzere bildirim gönderilmesi önerilir. Ayrıntılar için 1. Bildirim hatırlatıcısı.

Ayarlar ekranında izin isteme

Tehlikeli izinler, normal ActivityCompat#requestPermission() yöntemi (veya eşdeğeri) kullanılarak isteniyor. İzin isteme hakkında ayrıntılı bilgi için Uygulama İzinleri İsteme başlıklı makaleyi inceleyin.

İzin iste

Şekil 5. İzin iste

Bildirim dinleyici izni

TTR akışını uygulamak için VIA'ların bildirim dinleyici olarak belirlenmesi gerekir. Bu, izin olarak değerlendirilmez. Bunun yerine, sistemin kayıtlı dinleyicilere bildirim göndermesine olanak tanıyan bir yapılandırmadır. VIA'nın bu bilgilere erişim izni verilip verilmediğini öğrenmek için uygulamalar:

Bu erişim önceden verilmemişse VIA, kullanıcının araba ayarlarının Bildirim Erişimi bölümüne gitmesini sağlamak için hem sözlü ifadeler hem de bildirimler kullanmalıdır. Aşağıdaki kod, ayarlar uygulamasının uygun bölümünü açmak için kullanılabilir:

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ü uygulama

Bir VoiceInteractionSession, onShow() geri araması aldığında ses plakası kullanıcı arayüzü gösterebilir. Ses plakası uygulamasıyla ilgili görsel ve kullanıcı deneyimi kuralları için Önceden Yüklenmiş Asistanlar: Kullanıcı Deneyimi Kılavuzu'na bakın.

Ses plakasını gösterme

Şekil 6. Ses plakasını gösterme

Bu kullanıcı arayüzünü uygulamanın iki yolu vardır:

  • Geçersiz kıl: VoiceInteractionSession#onCreateContentView()
  • VoiceInteractionSession#startAssistantActivity() kullanarak etkinlik başlatma

onCreateContentView() işlevini kullanma

Bu, ses plakasını sunmanın varsayılan yoludur. VoiceInteractionSession Temel sınıf, bir pencere oluşturur ve ses oturumu devam ettiği sürece pencerenin yaşam döngüsünü yönetir. Uygulamalar, VoiceInteractionSession#onCreateContentView() işlevini geçersiz kılmalı ve oturum oluşturulur oluşturulmaz bu pencereye eklenmiş bir görünüm döndürmelidir. 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() üzerinde görünür hale gelmeli, ardından VoiceInteractionSession#onHide() üzerinde tekrar görünmez hale gelmelidir.

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, kullanıcı arayüzünüzün gizlenmiş bölgelerini hesaba katmak için VoiceInteractionSession#onComputeInsets() değerini ayarlamanız gerekebilir.

startAssistantActivity() işlevini kullanma

Bu durumda, VoiceInteractionSession ses plakası kullanıcı arayüzünün işlenmesini normal bir etkinliğe devreder. Bu seçenek kullanıldığında, VoiceInteractionSession uygulaması onPrepareShow() geri çağırma işleminde varsayılan içerik penceresinin oluşturulmasını devre dışı bırakmalıdır (bkz. onCreateContentView() kullanma). VoiceInteractionSession#onShow() zamanında oturum, VoiceInteractionSession#startAssistantActivity() kullanılarak sesli dikte etkinliğini başlatır. Bu yöntem, kullanıcı arayüzünü uygun pencere ayarları ve etkinlik işaretleriyle 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 arasında iletişimin sürdürülmesi için bir dizi dahili amaç veya hizmet bağlama gerekebilir. Örneğin, VoiceInteractionSession#onHide() çağrıldığında oturum, bu isteği etkinliğe iletebilmelidir.

Önemli. Otomotiv'de, sürüş sırasında yalnızca özel olarak açıklama eklenmiş etkinlikler veya UXR "izin verilenler listesinde" yer alan etkinlikler gösterilebilir. Bu durum, VoiceInteractionSession#startAssistantActivity() ile başlatılan etkinlikler için de geçerlidir. Etkinliğinize <meta-data android:name="distractionOptimized" android:value="true"/> ile açıklama eklemeyi veya bu etkinliği /packages/services/Car/service/res/values/config.xml dosyasının systemActivityWhitelist anahtarına dahil etmeyi unutmayın. Daha fazla bilgi için Sürücü Dikkatini Dağıtma Kuralları'nı inceleyin.

Ses tanımayı uygulama

Bu bölümde, etkin kelimelerin algılanması ve tanınması yoluyla ses tanımayı nasıl uygulayacağınızı öğreneceksiniz. Etkinleştirme kelimesi, sesle yeni bir sorgu veya işlem başlatmak için kullanılan tetikleyici bir kelimedir. Örneğin, "Ok Google" veya "Hey Google".

TTP özel kelime algılama

Android, AlwaysOnHotwordDetector aracılığıyla DSP düzeyinde her zaman açık özel kelime dedektörüne erişim sağlar. düşük CPU ile özel kelime algılamayı uygulama Bu işlevin kullanımı iki bölüme ayrılır:

VoiceInteractionService uygulaması, VoiceInteractionService#createAlwaysOnHotwordDetector() kullanarak bir hazır kelime dedektörü oluşturabilir.VoiceInteractionService#createAlwaysOnHotwordDetector(), algılama için kullanmak istedikleri bir anahtar kelime öbeği ve yerel ayarı iletir. Sonuç olarak, uygulama aşağıdaki olası değerlerden birini içeren bir onAvailabilityChanged() geri çağırma alır:

  • STATE_HARDWARE_UNAVAILABLE. DSP özelliği cihazda kullanılamaz. Bu durumda, yazılım özel kelime algılama özelliği kullanılır.
  • STATE_HARDWARE_UNSUPPORTED. TTP desteği genel olarak kullanılamaz ancak TTP, belirli anahtar kelime öbeği ve yerel ayar kombinasyonunu desteklemez. Uygulama, Yazılımla Özel Kelime Algılama'yı kullanmayı tercih edebilir.
  • STATE_HARDWARE_ENROLLED. Özel kelime algılama özelliği hazır ve startRecognition() yöntemi çağrılarak başlatılabilir.
  • STATE_HARDWARE_UNENROLLED. İstenen anahtar kelime öbeği için ses modeli mevcut değil ancak kayıt mümkün.

Özel kelime algılama ses modellerinin kaydı IVoiceInteractionManagerService#updateKeyphraseSoundModel() kullanılarak yapılabilir. Sisteme belirli bir zamanda birden fazla model kaydedilebilir ancak bir AlwaysOnHotwordDetector ile yalnızca bir model ilişkilendirilir. DSP özel kelime saptama özelliği tüm cihazlarda kullanılamayabilir. VIA geliştiricileri, getDspModuleProperties() yöntemini kullanarak donanım özelliklerini kontrol etmelidir. Ses modellerinin nasıl kaydedileceğini gösteren örnek kod için VoiceEnrollment/src/com/android/test/voiceenrollment/EnrollmentUtil.java bölümüne bakın. Aynı anda etkin kelime tanıma ile ilgili olarak Eşzamanlı yakalama konusuna bakın.

Yazılım özel kelime algılama

Yukarıda belirtildiği gibi, DSP sıcak kelime algılama özelliği tüm cihazlarda kullanılamayabilir (örneğin, Android emülatöründe DSP emülasyonu sağlanmaz). Bu durumda, tek alternatif yazılım ses tanımadır. Mikrofona erişmesi gerekebilecek diğer uygulamalara müdahale etmemek için VIA'lar ses girişine aşağıdaki yöntemlerle erişmelidir:

Bu sabitlerin ikisi de @hide ve yalnızca paketlenmiş uygulamalarda kullanılabilir.

Ses girişini ve ses tanımayı yönetme

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 MediaRecorder'a Genel Bakış başlıklı makaleyi inceleyin. Sesli etkileşim hizmetlerinin de RecognitionService sınıf uygulamaları olması beklenir. Sistemdeki ses tanıma gerektiren tüm uygulamalar bu özelliğe erişmek için kullanır. Ses tanıma ve mikrofona erişim için VIA'lar android.permission.RECORD_AUDIO tutmalıdır. RecognitionService uygulamasına erişen uygulamaların da bu izne sahip olması beklenir.

Android 10'dan önce, mikrofon erişimi yalnızca bir uygulamaya veriliyordu (etkin kelime algılama hariç, yukarıya bakın). Android 10'dan itibaren, mikrofon erişimi paylaşılabilir. Daha fazla bilgi için Ses Girişini Paylaşma başlıklı makaleyi inceleyin.

Ses çıkışına erişme

VIA sözlü yanıt vermeye hazır olduğunda aşağıdaki kurallara uymanız önemlidir: