Uygulama geliştirme

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

  1. VIA iskeleti oluşturun.
  2. (isteğe bağlı) Kurulum/oturum açma akışı uygulayın.
  3. (isteğe bağlı) Ayarlar ekranı uygulayın.
  4. Gerekli izinleri manifest dosyasında beyan edin.
  5. Sesli plaka kullanıcı arayüzü uygulayın.
  6. Ses tanımayı uygulayın (RecognitionService API uygulamasını içermelidir).
  7. Sözcüğü uygulayın (isteğe bağlı olarak TextToSpeech API'yi uygulayabilirsiniz).
  8. Komutların yerine getirilmesini uygulayın. Bu içeriği Komutları yerine getirme bölümünde bulabilirsiniz.

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

VIA iskeleti oluşturma

Manifestler

Bir uygulama, manifest dosyasına aşağıdakiler dahil edildiğinde sesli etkileşime sahip 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.SERVICE_INTERFACE ("android.service.voice.VoiceInteractionService") işlemi için bir intent filtresi içeren VoiceInteractionService'ü genişleten bir hizmet sunmalıdır.
  • Bu hizmetin BIND_VOICE_INTERACTION sistem imza izni olmalıdır.
  • Bu hizmet, aşağıdakileri içeren 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ılı bilgi için R.styleable#VoiceInteractionService başlıklı makaleyi inceleyin. Tüm VIA'ların ses tanımlayıcı hizmetleri de olması nedeniyle manifest dosyanıza 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 gereklidir:

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 diyagramda 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 bir VIA'nın 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 raporlar (Google Asistan Dokunarak Oku bölümüne bakın).
  • Kilit ekranından (kilit koruyucu) sesli etkileşim oturumları başlatma.

En basit haliyle bir VoiceInteractionService uygulaması aşağıdaki gibi 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;
    }
    ...
}

Google Asistan Dokunarak Oku özelliğini işlemek için VoiceInteractionService#onGetSupportedVoiceActions()'ün uygulanması gerekir. Sistem, VoiceInteractionSession oluşturmak ve bu oturumla etkileşimde bulunmak için VoiceInteractionSessionService kullanır. 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 çoğunun yapıldığı yer VoiceInteractionSession'dır. Tek bir oturum örneği, birden fazla kullanıcı etkileşimini tamamlamak için yeniden kullanılabilir. AAOS'ta, otomotiv sektörüne özgü bazı işlevlerin uygulanmasına yardımcı olan bir yardımcı CarVoiceInteractionSession vardır.

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. Tam listeyi VoiceInteractionSession dokümanlarında bulabilirsiniz.

Kurulum/oturum açma akışı uygulama

Kurulum ve oturum açma işlemleri şunlar olabilir:

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

Öne yüklenmiş asistanlar için önerilen kullanıcı deneyimi ve görsel rehberlik hakkında ayrıntılı bilgi edinmek istiyorsanız Önceden yüklenmiş asistanlar: Kullanıcı deneyimi rehberliği başlıklı makaleyi inceleyin.

Sesli hizmet değişimi sırasında kurulum

Kullanıcının, doğru şekilde yapılandırılmamış bir VIA seçmesi her zaman mümkündür. 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 kurulumu sırasında yapılandırılandan farklı bir VIA seçti.

Her durumda, VoiceInteractionService'nin 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: Belirli bir kullanıcı isteği olmadan VIA kurulum akışı sunulması önerilmez. Bu nedenle, VIA'lar cihazın başlatılması veya kullanıcının geçiş yapması ya da kilidi açması sonucunda HU'da otomatik olarak içerik göstermemelidir.

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ış şu şekilde işler:

Bildirim hatırlatıcısı akışı

Şekil 3. Bildirim hatırlatıcısı akışı

Sesli yanıt

Bu, uygulanması en kolay akıştır. VoiceInteractionSession#onShow() geri çağırma sırasında bir ifade başlatır, kullanıcıya yapılması gerekenleri açıklar ve ardından (UX Kısıtlama durumu göz önüne alındığında kuruluma izin veriliyorsa) kurulum akışını başlatmak isteyip istemediğini sorar. Kurulum şu anda mümkün değilse bu durumu da açıklayın.

İlk kullanımda kurulum

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

  1. Kullanıcıyı sözlü olarak bu durum hakkında bilgilendirin (örneğin, "Düzgün çalışması için birkaç adımı tamamlamanız gerekiyor… ").
  2. UX kısıtlamaları motoru izin veriyorsa (UX_RESTRICTIONS_NO_SETUP bölümüne bakın) kullanıcıya kurulum işlemini başlatmak isteyip istemediğini sorun ve ardından VIA'nın Ayarlar ekranını açın.
  3. Aksi takdirde (örneğin, kullanıcı araba kullanıyorsa) kullanıcının güvenli bir zamanda seçeneği tıklaması için bir 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 Rehberi başlıklı makalede, kullanıcı arayüzü geliştirmeyle ilgili kullanıcı deneyimi ve görsel yönergeleri bulabilirsiniz.

Genel yönergeler:

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 (Manifestler bölümüne bakın). Ayarlar bölümü, kuruluma ve oturum açmaya devam etmek (kullanıcı bunu tamamlamadıysa) veya gerekirse oturum 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:

Manifest dosyasında gerekli izinleri beyan etme

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

  • Sistem imza izinleri. Bu izinler yalnızca önceden yüklenmiş, sistem tarafından imzalanan APK'lara verilir. Kullanıcılar bu izinleri veremez. Yalnızca OEM'ler, sistem resimlerini oluştururken bu izinleri verebilir. İmza izinleri alma hakkında daha fazla bilgi için Sistem ayrıcalıklı izinleri 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 ayarın cihazdan cihaza değişebileceği göz önüne alındığında, uygulamalar gerektiğinde bu izinleri istemelidir.
  • Diğer izinler. Bunlar, kullanıcı müdahalesi gerektirmeyen diğer tüm izinlerdir. Bu izinler sistem tarafından otomatik olarak verilir.

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

Uygulamanın çalışması için gereken izinlere sahip olmaması durumunda, durumu kullanıcıya açıklamak için bir sesli ifade ve kullanıcının VIA ayarları ekranlarına geri dönmek için kullanabileceği bir imkân sağlamak üzere bir bildirim kullanılması önerilir. Ayrıntılar için 1. Bildirim hatırlatıcısı.

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 isteme hakkında ayrıntılı bilgi için Uygulama İzni İsteme başlıklı makaleyi inceleyin.

İzin isteme

Şekil 5. İzin isteme

Bildirim dinleyici izni

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

Bu erişim önceden verilmemişse VIA, kullanıcıyı ifadeler ve bildirimlerin bir kombinasyonunu kullanarak Araba Ayarları'nın Bildirim Erişimi bölümüne yönlendirmelidir. Aşağıdaki kod, ayarlar uygulamasının ilgili 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);
}

Sesli plaka kullanıcı arayüzü uygulama

Bir VoiceInteractionSession, onShow() geri araması aldığında sesli plaka kullanıcı arayüzü sunabilir. Sesli plaka uygulamasıyla ilgili görsel ve kullanıcı deneyimi yönergeleri için Önceden Yüklü Asistanlar: Kullanıcı Deneyimi Kılavuzu başlıklı makaleyi inceleyin.

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

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

Bu kullanıcı arayüzünü uygulamak için iki seçenek vardır:

  • VoiceInteractionSession#onCreateContentView() öğesini geçersiz kılma
  • VoiceInteractionSession#startAssistantActivity()'ü kullanarak etkinlik başlatma

onCreateContentView() işlevini kullanma

Bu, ses plakasını sunmanın varsayılan yoludur. VoiceInteractionSessionTemel sınıf, bir ses oturumu etkin olduğu sürece bir pencere oluşturur ve yaşam döngüsünü yönetir. Uygulamalar, oturum oluşturulur oluşturulmaz VoiceInteractionSession#onCreateContentView()'ü geçersiz kılmamalı ve bu pencereye bağlı 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()'te görünür hale getirilmeli ve ardından VoiceInteractionSession#onHide()'te 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 kullanıcı arayüzünüzün gizlenen bölgelerini hesaba katmak için VoiceInteractionSession#onComputeInsets() değerini ayarlamak isteyebilirsiniz.

startAssistantActivity() işlevini kullanma

Bu durumda VoiceInteractionSession, sesli ekran kullanıcı arayüzünün işlenmesini normal bir etkinliğe delege eder. Bu seçenek kullanıldığında VoiceInteractionSessionuygulaması, onPrepareShow()geri çağırma işlevinde varsayılan içerik penceresinin oluşturulmasını devre dışı bırakmalıdır (onCreateContentView() işlevini kullanma bölümüne bakın). VoiceInteractionSession#onShow() zamanında oturum, VoiceInteractionSession#startAssistantActivity() kullanarak sesli plaka etkinliğini başlatır. Bu yöntem, kullanıcı arayüzünü uygun pencere ayarlarıyla 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şimi sürdürmek için bir dizi dahili Intent veya hizmet bağlaması gerekebilir. Örneğin, VoiceInteractionSession#onHide() çağrıldığında oturum bu isteği etkinliğe iletebilmelidir.

Önemli. Otomotiv'te, sürüş sırasında yalnızca özel olarak ek açıklama eklenmiş etkinlikler veya UXR "izin verilenler listesi"nde listelenen etkinlikler gösterilebilir. Bu durum, VoiceInteractionSession#startAssistantActivity() ile başlayan etkinlikler için de geçerlidir. Etkinliğinizi <meta-data android:name="distractionOptimized" android:value="true"/> ile notlandırmayı veya bu etkinliği /packages/services/Car/service/res/values/config.xml dosyasının systemActivityWhitelist anahtarına eklemeyi unutmayın. Daha fazla bilgi için Sürücünün Dikkatinin Dağılmasıyla İlgili Yönergeler'e bakın.

Ses tanımayı uygulama

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

DSP özel kelime algılama

Android, AlwaysOnHotwordDetector aracılığıyla DSP düzeyinde her zaman açık bir özel kelime algılayıcıya erişim sağlar. düşük CPU kullanımıyla özel kelime algılama özelliğini uygulamanın en iyi yoludur. Bu işlevin kullanımı iki bölüme ayrılır:

VoiceInteractionService uygulaması, VoiceInteractionService#createAlwaysOnHotwordDetector() kullanarak bir özel kelime algılayıcı oluşturabilir. Bu işlem için algılamada kullanmak istedikleri anahtar kelimeyi ve yerel ayarı iletirler. 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ılamıyor. Bu durumda, yazılım özel kelime algılama özelliği kullanılır.
  • STATE_HARDWARE_UNSUPPORTED. DSP desteği genel olarak kullanılamaz ancak DSP, belirli anahtar kelime ve yerel ayar kombinasyonunu desteklemez. Uygulama, Yazılım Özel Kelime Algılama'yı kullanabilir.
  • STATE_HARDWARE_ENROLLED. Özel kelime algılama hazırdır ve startRecognition() yöntemi çağrılarak başlatılabilir.
  • STATE_HARDWARE_UNENROLLED. İstenen anahtar kelime için ses modeli mevcut değil ancak kayıt yapılabilir.

Özel kelime algılama ses modellerinin kaydı IVoiceInteractionManagerService#updateKeyphraseSoundModel() kullanılarak yapılabilir. Belirli bir zamanda sisteme birden fazla model kaydedilebilir ancak bir AlwaysOnHotwordDetector ile yalnızca bir model ilişkilendirilir. DSP özel kelime algılama ö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. Eşzamanlı özel kelime tanıma ile ilgili olarak Eşzamanlı kayıt bölümüne bakın.

Yazılım özel kelime algılama

Yukarıda belirtildiği gibi, DSP anahtar kelime 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 özelliği tek alternatiftir. Mikrofon erişimi gerekebilecek diğer uygulamaların çalışmasını engellememek için VIA'ların ses girişine şu yöntemleri kullanarak erişmesi gerekir:

Bu iki sabit değer de @hide olup yalnızca paketlenmiş uygulamalar tarafından 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ının olması beklenir. Sistemde ses tanıma gerektiren tüm uygulamalar bu özelliğe erişmek için bu izni kullanır. Ses tanıma işlemi yapmak ve mikrofona erişmek için VIA'ların android.permission.RECORD_AUDIO değerini tutması gerekir. RecognitionService uygulamasına erişen uygulamaların da bu izne sahip olması gerekir.

Android 10'dan önce, mikrofon erişimi aynı anda yalnızca bir uygulamaya veriliyordu (anahtar kelime algılama hariç, yukarıdaki bölüme bakın). Android 10'dan itibaren mikrofon erişimi paylaşılabilir. Daha fazla bilgi için Ses Girişi Paylaşımı başlıklı makaleyi inceleyin.

Ses çıkışına erişim

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