Uygulama geliştirme

Sesli Etkileşim Uygulamasını (VIA) uygulamak için şu adımları tamamlamanız gerekir:

  1. Bir VIA iskeleti oluşturun.
  2. ( isteğe bağlı ) Bir kurulum/oturum açma akışı uygulayın.
  3. ( isteğe bağlı ) Ayarlar ekranını uygulayın.
  4. Bildirim dosyasında gerekli izinleri bildirin.
  5. Bir ses plakası kullanıcı arayüzü uygulayın.
  6. Ses tanımayı uygulayın (RecognitionService API uygulamasını içermelidir).
  7. Söylemi uygulayın (isteğe bağlı olarak TextToSpeech API'sini uygulayabilirsiniz).
  8. Komutların yerine getirilmesini uygulayın. Bu içeriğe Komutları Yerine Getirme bölümünde bakın.

Aşağıdaki bölümlerde yukarıda bahsedilen her adımın nasıl tamamlanacağı açıklanmaktadır.

Bir VIA iskeleti oluşturun

Manifestolar

Aşağıdakiler manifestte yer aldığında bir uygulamanın Ses Etkileşimi içeren bir uygulama olduğu 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.SERVICE_INTERFACE ("android.service.voice.VoiceInteractionService") eylemi için bir amaç filtresiyle VoiceInteractionService genişleten bir hizmeti kullanıma sunmalıdır.
  • Bu hizmetin BIND_VOICE_INTERACTION sistem imza iznine sahip olması gerekir.
  • Bu hizmet, aşağıdakileri içerecek bir android.voice_interaction meta 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ılar için bkz. R.styleable#VoiceInteractionService . Tüm VIA'ların aynı zamanda ses tanıma hizmetleri olduğu göz önüne alındığında, bildiriminize 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 ayrıca aşağıdaki meta veri parçasını da gerektirir:

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 diyagram bu varlıkların her birinin yaşam döngüsünü göstermektedir:

Yaşam döngüsü

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

Daha önce de belirtildiği gibi VoiceInteractionService , VIA'ya giriş noktasıdır. Bu hizmetin ana 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 raporlar (bkz. Sesli Asistan Dokunarak Okuma ).
  • Kilit ekranından (tuş kilidi) sesli etkileşim oturumlarını başlatın.

En basit haliyle bir VoiceInteractionService uygulaması şöyle görünecektir:

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

Voice Assistant Dokunarak Oku özelliğini işlemek için VoiceInteractionService#onGetSupportedVoiceActions() uygulamasının uygulanması gerekir. VoiceInteractionSessionService , sistem tarafından bir VoiceInteractionSession oluşturmak ve etkileşimde bulunmak için kullanılır. Tek bir sorumluluğu vardır, istendiğinde yeni oturumlara başlamak.

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

Son olarak, işin çoğunun yapılacağı yer VoiceInteractionSession'dır . Tek bir oturum örneği, birden fazla kullanıcı etkileşimini tamamlamak için yeniden kullanılabilir. AAOS'ta, otomotive özgü bazı işlevlerin uygulanmasına yardımcı olan bir yardımcı CarVoiceInteractionSession mevcuttur.

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 geniş bir geri çağırma yöntemleri kümesine sahiptir. Tam liste için VoiceInteractionSession belgelerine bakın.

Kurulum/oturum açma akışını uygulama

Kurulum ve oturum açma şu durumlarda gerçekleşebilir:

  • Aygıtın eklenmesi sırasında (Kurulum Sihirbazı).
  • Sesli etkileşim hizmeti değişimi sırasında (Ayarlar).
  • Uygulama seçildiğinde ilk başlatmada.

Önerilen kullanıcı deneyimi ve görsel rehberlikle ilgili ayrıntılar için bkz. Önceden Yüklenmiş Yardımcılar: Kullanıcı Deneyimi Kılavuzu .

Ses hizmeti değişimi sırasında kurulum

Kullanıcının düzgün yapılandırılmamış bir VIA'yı seçmesi her zaman mümkündür. Bunun nedeni şunlar olabilir:

  • Kullanıcı Kurulum Sihirbazını tamamen atladı veya kullanıcı sesli etkileşim yapılandırma adımını atladı.
  • Kullanıcı, cihaza katılım sırasında yapılandırılandan farklı bir VIA seçmiştir.

Her durumda, VoiceInteractionService kullanıcıyı kurulumu tamamlamaya teşvik etmenin birkaç yolu vardır:

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

Not : Açık bir kullanıcı isteği olmadan VIA kurulum akışının sunulması kesinlikle önerilmez. Bu, VIA'ların, cihaz önyüklemesi sırasında veya kullanıcı değişikliği veya kilidin açılması sonucunda HU'da otomatik olarak içerik görüntülemekten kaçınması gerektiği anlamına gelir.

Bildirim hatırlatıcısı

Bildirim hatırlatıcısı, kurulum ihtiyacını belirtmenin ve kullanıcılara asistan kurulum akışında gezinme olanağı sağlamanın müdahaleci olmayan bir yoludur.

Bildirim hatırlatıcısı

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

Bu akışın nasıl işleyeceği aşağıda açıklanmıştır:

Bildirim hatırlatma akışı

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

Sesli yanıt

Bu, VoiceInteractionSession#onShow() geri aramasında bir ifade başlatmak, kullanıcıya ne yapılması gerektiğini açıklamak ve ardından (UX Kısıtlama durumu göz önüne alındığında kuruluma izin veriliyorsa) başlatmak isteyip istemediklerini sormak, uygulanması en basit akıştır. kurulum akışı. Kurulum o anda mümkün değilse bu durumu da açıklayın.

İlk kullanımda kurulum

Kullanıcının düzgün 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ışabilmek için birkaç adımı tamamlamanız gerekiyor...").
  2. UX kısıtlama motoru izin veriyorsa (bkz. UX_RESTRICTIONS_NO_SETUP ), kullanıcıya kurulum işlemini başlatmak isteyip istemediğini sorun ve ardından VIA için Ayarlar ekranını açın.
  3. Aksi takdirde (örneğin, kullanıcı araba kullanıyorsa), güvenli olduğunda kullanıcının seçeneğe tıklaması için bir bildirim bırakın.

Sesli etkileşim kurulum ekranları oluşturun

Kurulum ve oturum açma ekranları düzenli faaliyetler olarak geliştirilmelidir. Önceden Yüklenmiş Asistanlar: UX Rehberi'nde kullanıcı arayüzü geliştirmeye yönelik kullanıcı deneyimi ve görsel yönergelere bakın.

Genel kurallar:

  • VIA'lar, kullanıcıların istedikleri zaman kurulumu yarıda kesmesine ve devam ettirmesine izin vermelidir.
  • UX_RESTRICTIONS_NO_SETUP kısıtlaması geçerliyse kuruluma izin verilmemelidir. Ayrıntılar için bkz. Sürücünün Dikkatini Dağıtma Yönergeleri .
  • Kurulum ekranları her aracın tasarım sistemine uygun olmalıdır. Genel ekran düzeni, simgeler, renkler ve diğer özellikler kullanıcı arayüzünün geri kalanıyla tutarlı olmalıdır. Ayrıntılar için Özelleştirme'ye bakın.

Bir ayarlar ekranı uygulayın

Ayarlar entegrasyonu

Şekil 4. Ayarların entegrasyonu

Ayarlar ekranları normal Android etkinlikleridir. Uygulandığı takdirde giriş noktaları, VIA bildirimlerinin bir parçası olarak res/xml/interaction_service.xml dosyasında bildirilmelidir (bkz. Manifest'ler ). Ayarlar bölümü, kuruluma devam etmek ve oturum açmak (kullanıcı bunu tamamlamadıysa) veya gerekirse oturum kapatma veya 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:

Manifest dosyasında gerekli izinleri bildirin

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

  • Sistem imza 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 bunları verebilir. İmza izinlerini alma hakkında daha fazla bilgi için bkz . Sistem Ayrıcalıklı İzinler Verme .
  • Tehlikeli izinler. Bunlar, bir 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ın cihazdan cihaza değişebileceği göz önüne alındığında, uygulamaların gerektiğinde bu izinleri isteyebilmesi gerekir.
  • Diğer izinler. Bunların tümü kullanıcı müdahalesi gerektirmeyen diğer izinlerdir. Bu izinler sistem tarafından otomatik olarak verilmektedir.

Yukarıdakiler göz önüne alındığında, aşağıdaki bölüm yalnızca tehlikeli izinlerin talep edilmesine odaklanmaktadır. İzinler yalnızca kullanıcı oturum açma veya ayar ekranlarındayken istenmelidir.

Uygulamanın çalışması için gereken izinler yoksa önerilen akış, kullanıcıya durumu açıklamak için sesli bir ifade kullanmak ve kullanıcının VIA ayarları ekranlarına geri dönmek için kullanabileceği bir olanak sağlamak üzere bir bildirim kullanmaktır. . Ayrıntılar için bkz. 1. Bildirim hatırlatıcısı .

Ayar ekranının bir parçası olarak izin isteyin

Normal ActivityCompat#requestPermission() yöntemi (veya eşdeğeri) kullanılarak tehlikeli izinler isteniyor. İzinlerin nasıl talep edileceğine ilişkin ayrıntılar için bkz. Uygulama İzinlerini Talep Etme .

İzin iste

Şekil 5. İzin isteme

Bildirim dinleyicisi izni

TTR akışını uygulamak için VIA'ların bildirim dinleyicisi olarak atanması gerekir. Bu kendi başına bir izin değildir, bunun yerine sistemin kayıtlı dinleyicilere bildirim göndermesine olanak tanıyan bir yapılandırmadır. VIA'nın bu bilgilere erişmesine izin verilip verilmediğini öğrenmek için uygulamalar şunları yapabilir:

Bu erişime önceden izin verilmediyse VIA, ifadeler ve bildirimlerin bir kombinasyonunu kullanarak kullanıcıyı Araç Ayarlarının Bildirim Erişimi bölümüne yönlendirmelidir. Ayarlar uygulamasının uygun bölümünü açmak için aşağıdaki kod kullanılabilir:

private void requestNotificationListenerAccess() {
    Intent intent = new Intent(Settings
        .ACTION_NOTIFICATION_LISTENER_SETTINGS);
    intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
    startActivity(intent);
}

Bir ses plakası kullanıcı arayüzü uygulayın

VoiceInteractionSession bir onShow() geri araması aldığında, bir ses plakası kullanıcı arayüzü sunabilir. Ses plakası uygulamasına ilişkin görsel ve UX yönergeleri için bkz. Önceden Yüklenmiş Asistanlar: UX Kılavuzu .

Ses plakasının görüntülenmesi

Şekil 6. Ses plakasının görüntülenmesi

Bu kullanıcı arayüzünün nasıl uygulanacağına ilişkin iki seçenek vardır:

  • VoiceInteractionSession#onCreateContentView() ı geçersiz kıl
  • VoiceInteractionSession#startAssistantActivity() kullanarak bir Etkinlik başlatın

onCreateContentView() işlevini kullanın

Bu, bir ses plakası sunmanın varsayılan yoludur. VoiceInteractionSession temel sınıfı bir pencere oluşturur ve sesli oturum canlı olduğu sürece yaşam döngüsünü yönetir. Uygulamalar, VoiceInteractionSession#onCreateContentView() geçersiz kılmalı ve oturum oluşturulur oluşturulmaz o pencereye eklenen görünümü döndürmelidir. Bu görünüm başlangıçta görünmez olmalıdır. Bir sesli etkileşim başladığında, bu görünüm VoiceInteractionSession#onShow() üzerinde görünür hale getirilmeli ve ardından VoiceInteractionSession#onHide() üzerinde tekrar görünmez hale getirilmelidir.

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() işlevini kullanıcı arayüzünüzün gizlenen bölgelerini hesaba katacak şekilde ayarlamak isteyebilirsiniz.

startAssistantActivity()'yi kullanın

Bu durumda VoiceInteractionSession , ses plakası kullanıcı arayüzünün işlenmesini düzenli bir etkinliğe devreder. Bu seçenek kullanıldığında, bir VoiceInteractionSession uygulamasının onPrepareShow() geri çağrısında varsayılan içerik penceresinin oluşturulmasını devre dışı bırakması gerekir (bkz. onCreateContentView() işlevinin kullanılması ). VoiceInteractionSession#onShow() konumunda oturum, VoiceInteractionSession#startAssistantActivity() kullanarak ses plakası etkinliğini başlatır. Bu yöntem, 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 arasındaki iletişimi sürdürmek için bir dizi dahili Amaç veya hizmet bağlaması gerekebilir. Örneğin, VoiceInteractionSession#onHide() çağrıldığında oturumun bu isteği aktiviteye iletebilmesi gerekir.

Önemli. Otomotiv'de, yalnızca özel açıklamalı etkinlikler veya UXR "izin verilenler listesinde" listelenen etkinlikler sürüş sırasında görüntülenebilir. Bu aynı zamanda 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 eklemeyi unutmayın. /packages/services/Car/service/res/values/config.xml dosyası. Daha fazla bilgi için bkz. Sürücünün Dikkatini Dağıtma Yönergeleri .

Ses tanımayı uygulayın

Bu bölümde, özel kelimelerin tespiti ve tanınması yoluyla ses tanımanın nasıl uygulanacağını öğreneceksiniz. Özel kelime, sesle yeni bir sorgu veya işlem başlatmak için kullanılan tetikleyici bir kelimedir. Örneğin, "Tamam Google" veya "Hey Google".

DSP özel kelime algılama

Android, AlwaysOnHotwordDetector aracılığıyla DSP düzeyinde her zaman açık olan bir özel kelime algılayıcıya erişim sağlar. Düşük CPU ile özel kelime algılamayı uygulamanın yolu. Bu işlevselliğin kullanımı iki bölüme ayrılmıştır:

VoiceInteractionService uygulaması, VoiceInteractionService#createAlwaysOnHotwordDetector() kullanarak, algılama için kullanmak istedikleri bir anahtar sözcük ve yerel ayarı ileterek bir özel sözcük algılayıcı oluşturabilir. Sonuç olarak uygulama, aşağıdaki olası değerlerden birine sahip bir onAvailabilityChanged() geri çağrısı alır:

  • STATE_HARDWARE_UNAVAILABLE . Cihazda DSP özelliği mevcut değil. Bu durumda Yazılım özel kelime algılaması kullanılır.
  • STATE_HARDWARE_UNSUPPORTED . DSP desteği genel olarak mevcut değildir ancak DSP, verilen anahtar sözcük ve yerel ayar kombinasyonunu desteklemez. Uygulama, Yazılım Özel Kelime Algılama özelliğini kullanmayı seçebilir.
  • STATE_HARDWARE_ENROLLED . Sıcak sözcük algılaması hazırdır ve startRecognition() yöntemi çağrılarak başlatılabilir.
  • STATE_HARDWARE_UNENROLLED . İstenilen anahtar sözcük için ses modeli mevcut değil ancak kayıt mümkündür.

Özel kelime algılama ses modellerinin kaydı IVoiceInteractionManagerService#updateKeyphraseSoundModel() kullanılarak yapılabilir. Belirli bir zamanda sisteme birden fazla model kaydedilebilir, ancak yalnızca bir model AlwaysOnHotwordDetector ile ilişkilendirilir. DSP özel kelime algılama özelliği tüm cihazlarda mevcut olmayabilir. VIA geliştiricileri, getDspModuleProperties() yöntemini kullanarak donanım yeteneklerini kontrol etmelidir. Ses modellerinin nasıl kaydedileceğini gösteren örnek kod için bkz. VoiceEnrollment/src/com/android/test/voiceenrollment/EnrollmentUtil.java . Eşzamanlı özel sözcük tanımayla ilgili Eşzamanlı yakalama'ya bakın.

Yazılım özel kelime algılama

Yukarıda belirtildiği gibi, DSP özel sözcük algılama tüm cihazlarda kullanılamayabilir (örneğin, Android emülatörü DSP emülasyonu sağlamaz). Bu durumda yazılım ses tanıma tek alternatiftir. Mikrofona erişmesi gerekebilecek diğer uygulamalara müdahaleyi önlemek için VIA'ların ses girişine aşağıdakileri kullanarak erişmesi gerekir:

Bu sabitlerin her ikisi de @hide hide'dır ve yalnızca birlikte verilen uygulamalarda kullanılabilir.

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

Ses girişi MediaRecorder sınıfı kullanılarak uygulanacaktır. Bu API'nin nasıl kullanılacağı hakkında daha fazla bilgi için MediaRecorder'a Genel Bakış'a bakın. Sesli etkileşim hizmetlerinin de RecognitionService sınıfı uygulamaları olması bekleniyor. Sistemde ses tanıma gerektiren herhangi bir uygulama, bu özelliğe erişmek için bu özelliği kullanır. Ses tanımayı gerçekleştirmek ve mikrofona erişebilmek için VIA'ların android.permission.RECORD_AUDIO sahip olması gerekir. RecognitionService uygulamasına erişen uygulamaların da bu izne sahip olması beklenir.

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

Ses çıkışına erişim

VIA sözlü yanıtlar vermeye hazır olduğunda aşağıdaki yönergeleri takip etmek önemlidir: