توسعه برنامه

برای اجرای یک برنامه تعامل صوتی (VIA)، این مراحل را کامل کنید:

  1. یک اسکلت VIA ایجاد کنید.
  2. ( اختیاری ) یک جریان راه اندازی/ورود به سیستم را اجرا کنید.
  3. ( اختیاری ) یک صفحه تنظیمات را اجرا کنید.
  4. مجوزهای لازم را در فایل مانیفست اعلام کنید.
  5. یک رابط کاربری صفحه صوتی را پیاده سازی کنید.
  6. تشخیص صدا را پیاده سازی کنید (باید شامل اجرای RecognitionService API باشد).
  7. پیاده سازی بیان (به صورت اختیاری، می توانید API TextToSpeech را پیاده سازی کنید).
  8. اجرای دستورات این محتوا را در Fulfilling Commands ببینید.

بخش های زیر نحوه تکمیل هر مرحله ذکر شده در بالا را شرح می دهد.

یک اسکلت VIA ایجاد کنید

تجلی می کند

زمانی که موارد زیر در مانیفست گنجانده شده باشد، یک برنامه با تعامل صوتی شناسایی می‌شود:

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>

در این مثال:

  • VIAها باید سرویسی را که VoiceInteractionService را گسترش می‌دهد، با یک فیلتر هدف برای عملکرد VoiceInteractionService.SERVICE_INTERFACE ("android.service.voice.VoiceInteractionService") در معرض نمایش قرار دهند.
  • این سرویس باید دارای مجوز امضای سیستم BIND_VOICE_INTERACTION باشد.
  • این سرویس باید شامل یک فایل فراداده android.voice_interaction باشد که حاوی موارد زیر باشد:

    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" />
    

برای جزئیات در مورد هر زمینه، R.styleable#VoiceInteractionService را ببینید. با توجه به اینکه همه VIAها خدمات تشخیص صدا نیز هستند، باید موارد زیر را نیز در مانیفست خود بگنجانید:

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>

خدمات تشخیص صدا همچنین به بخش فوق داده زیر نیاز دارد:

res/xml/recognition_service.xml

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

VoiceInteractionService، VoiceInteractionSessionService و VoiceInteractionSession

نمودار زیر چرخه عمر هر یک از این موجودات را نشان می دهد:

چرخه های زندگی

شکل 1. چرخه های زندگی

همانطور که قبلاً گفته شد، VoiceInteractionService نقطه ورود به یک VIA است. وظایف اصلی این سرویس عبارتند از:

  • هر فرآیندی را که باید تا زمانی که این VIA فعال است، در حال اجرا نگه داشته شود، راه اندازی کنید. به عنوان مثال، تشخیص کلید واژه.
  • عملکردهای صوتی پشتیبانی شده را گزارش می‌کند (به دستیار صوتی ضربه زدن برای خواندن مراجعه کنید).
  • جلسات تعامل صوتی را از صفحه قفل (صفحه کلید) راه اندازی کنید.

در ساده‌ترین شکل، پیاده‌سازی VoiceInteractionService به شکل زیر است:

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() برای مدیریت ضربه زدن به خواندن دستیار صوتی مورد نیاز است. یک VoiceInteractionSessionService توسط سیستم برای ایجاد و تعامل با VoiceInteractionSession استفاده می شود. فقط یک مسئولیت دارد، شروع جلسات جدید در صورت درخواست.

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

در نهایت، VoiceInteractionSession جایی است که بیشتر کارها انجام می شود. یک نمونه جلسه ممکن است دوباره برای تکمیل تعاملات چند کاربر استفاده شود. در AAOS، CarVoiceInteractionSession کمکی وجود دارد که به پیاده سازی برخی از قابلیت های منحصر به فرد خودرو کمک می کند.

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 دارای مجموعه بزرگی از روش های برگشت تماس است که در بخش های زیر توضیح داده شده است. مستندات VoiceInteractionSession را یک لیست کامل ببینید.

یک جریان راه اندازی/ورود به سیستم را اجرا کنید

راه‌اندازی و ورود به سیستم ممکن است رخ دهد:

  • در حین ورود به دستگاه (جادوگر راه اندازی).
  • در حین تعویض سرویس تعامل صوتی (تنظیمات).
  • پس از اولین راه اندازی زمانی که برنامه انتخاب شده است.

برای جزئیات بیشتر در مورد تجربه کاربری توصیه شده و راهنمایی بصری، به دستیاران از قبل بارگذاری شده: راهنمای UX مراجعه کنید.

راه‌اندازی در حین تعویض سرویس صوتی

همیشه این امکان برای کاربر وجود دارد که یک VIA را انتخاب کند که به درستی پیکربندی نشده است. این می تواند اتفاق بیفتد زیرا:

  • کاربر Setup Wizard را به طور کامل نادیده گرفت یا کاربر مرحله پیکربندی تعامل صوتی را نادیده گرفت.
  • کاربر یک VIA متفاوت از آنچه در هنگام سوار شدن دستگاه پیکربندی شده بود انتخاب کرد.

در هر صورت، VoiceInteractionService چندین راه برای تشویق کاربر برای تکمیل تنظیمات دارد:

  • یادآوری اعلان.
  • پاسخ صوتی خودکار زمانی که کاربر سعی می کند از آن استفاده کند.

توجه : ارائه یک جریان راه اندازی VIA بدون درخواست صریح کاربر به شدت ممنوع است. این بدان معناست که VIAها باید از نمایش خودکار محتوا در HU در هنگام بوت شدن دستگاه یا در نتیجه تغییر یا باز کردن قفل کاربر اجتناب کنند.

یادآوری اعلان

یادآوری اعلان روشی غیر مزاحم برای نشان دادن نیاز به راه‌اندازی و فراهم کردن امکانی برای کاربران برای حرکت به جریان راه‌اندازی دستیار است.

یادآوری اعلان

شکل 2. یادآوری اعلان

در اینجا نحوه عملکرد این جریان آمده است:

جریان یادآور اعلان

شکل 3. جریان یادآوری اعلان

پاسخ صوتی

این ساده‌ترین جریان برای پیاده‌سازی است، با شروع یک بیان در VoiceInteractionSession#onShow() ، به کاربر توضیح می‌دهد که چه کاری باید انجام شود، و سپس از او می‌پرسد (آیا راه‌اندازی با توجه به وضعیت UX Restriction مجاز است) آیا می‌خواهد شروع کند. جریان راه اندازی اگر تنظیم در آن زمان ممکن نیست، این وضعیت را نیز توضیح دهید.

راه اندازی در اولین استفاده

همیشه این امکان برای کاربر وجود دارد که یک VIA را راه اندازی کند که به درستی پیکربندی نشده است. در اینگونه موارد:

  1. به طور شفاهی کاربر را در مورد این وضعیت آگاه کنید (به عنوان مثال، "برای درست کار کردن، باید چند مرحله را انجام دهید ...").
  2. اگر موتور محدودیت‌های UX اجازه می‌دهد (به UX_RESTRICTIONS_NO_SETUP مراجعه کنید)، از کاربر بپرسید که آیا می‌خواهد فرآیند راه‌اندازی را شروع کند و سپس صفحه تنظیمات را برای VIA باز کنید.
  3. در غیر این صورت (به عنوان مثال، اگر کاربر در حال رانندگی است)، یک اعلان برای کاربر بگذارید تا در صورت ایمن بودن این کار، روی گزینه کلیک کند.

ساخت صفحات راه اندازی تعامل صوتی

صفحه‌های راه‌اندازی و ورود به سیستم باید به‌عنوان فعالیت‌های عادی توسعه داده شوند. دستورالعمل‌های UX و بصری توسعه رابط کاربری را در دستیاران از پیش بارگذاری شده ببینید: راهنمای UX .

دستورالعمل های عمومی:

  • VIA ها باید به کاربران اجازه دهند که در هر زمان راه اندازی را قطع کرده و از سر بگیرند.
  • اگر محدودیت UX_RESTRICTIONS_NO_SETUP اعمال می شود، نباید راه اندازی مجاز باشد. برای جزئیات، به دستورالعمل های حواس پرتی راننده مراجعه کنید.
  • صفحه‌های راه‌اندازی باید با سیستم طراحی هر خودرو مطابقت داشته باشند. طرح کلی صفحه نمایش، نمادها، رنگ ها و سایر جنبه ها باید با بقیه UI سازگار باشد. برای جزئیات بیشتر به سفارشی سازی مراجعه کنید.

یک صفحه تنظیمات را پیاده سازی کنید

ادغام تنظیمات

شکل 4. ادغام تنظیمات

صفحه‌های تنظیمات، فعالیت‌های عادی اندروید هستند. در صورت پیاده سازی، نقطه ورود آنها باید در res/xml/interaction_service.xml به عنوان بخشی از مانیفست های VIA اعلام شود (به Manifests مراجعه کنید). بخش تنظیمات مکان خوبی برای ادامه راه‌اندازی و ورود به سیستم (اگر کاربر آن را کامل نکرده باشد) یا در صورت نیاز گزینه خروج از سیستم یا تغییر کاربر را ارائه می‌دهد. مشابه صفحه‌های راه‌اندازی که در بالا توضیح داده شد، این صفحه‌ها باید:

  • گزینه خروج از صفحه قبلی را در پشته صفحه (مثلاً به تنظیمات خودرو) ارائه دهید.
  • در حین رانندگی مجاز نیست برای جزئیات، به دستورالعمل های حواس پرتی راننده مراجعه کنید.
  • هر سیستم طراحی خودرو را مطابقت دهید. برای جزئیات، به سفارشی سازی مراجعه کنید.

مجوزهای مورد نیاز را در فایل مانیفست اعلام کنید

مجوزهای مورد نیاز VIA را می توان به سه دسته تقسیم کرد:

  • مجوزهای امضای سیستم اینها مجوزهایی هستند که فقط به APKهای از پیش نصب شده با امضای سیستم اعطا می شوند. کاربران نمی‌توانند این مجوزها را اعطا کنند، فقط OEMها می‌توانند هنگام ساخت تصاویر سیستم خود، این مجوزها را اعطا کنند. برای اطلاعات بیشتر در مورد دریافت مجوزهای امضا، به Grant System-Privileged Permissions مراجعه کنید.
  • مجوزهای خطرناک اینها مجوزهایی هستند که کاربر باید با استفاده از کادر گفتگوی PermissionsController به آنها بدهد. OEM ها می توانند برخی از این مجوزها را از قبل به VoiceInteractionService پیش فرض اعطا کنند. اما با توجه به اینکه این پیش‌فرض ممکن است از دستگاهی به دستگاه دیگر تغییر کند، برنامه‌ها باید بتوانند در صورت نیاز این مجوزها را درخواست کنند.
  • سایر مجوزها اینها همه مجوزهای دیگری هستند که نیازی به دخالت کاربر ندارند. این مجوزها به طور خودکار توسط سیستم اعطا می شوند.

با توجه به موارد فوق، بخش زیر فقط بر روی درخواست مجوزهای خطرناک تمرکز دارد. مجوزها فقط باید زمانی درخواست شوند که کاربر در صفحه ورود به سیستم یا تنظیمات است.

اگر برنامه مجوزهای لازم برای کار را ندارد، جریان پیشنهادی استفاده از یک گفتار صوتی برای توضیح وضعیت به کاربر و یک اعلان برای ارائه هزینه ای است که کاربر می تواند برای بازگشت به صفحه تنظیمات VIA از آن استفاده کند. . برای جزئیات، به 1. یادآوری اعلان مراجعه کنید.

مجوزها را به عنوان بخشی از صفحه تنظیمات درخواست کنید

مجوزهای خطرناک با استفاده از روش معمولی ActivityCompat#requestPermission() (یا معادل) درخواست می شوند. برای جزئیات در مورد نحوه درخواست مجوز، به درخواست مجوزهای برنامه مراجعه کنید.

درخواست مجوزها

شکل 5. درخواست مجوز

مجوز شنونده اعلان

برای اجرای جریان TTR، VIAها باید به عنوان شنونده اعلان تعیین شوند. این به خودی خود یک مجوز نیست، بلکه پیکربندی است که به سیستم اجازه می‌دهد تا اعلان‌ها را برای شنوندگان ثبت‌شده ارسال کند. برای اطلاع از اینکه آیا VIA به این اطلاعات دسترسی داشته است یا خیر، برنامه‌ها می‌توانند:

اگر این دسترسی از قبل اعطا نشده باشد، VIA باید با استفاده از ترکیبی از گفته‌ها و اعلان‌ها، کاربر را به بخش دسترسی به اعلان در تنظیمات خودرو هدایت کند. کد زیر را می توان برای باز کردن بخش مناسب برنامه تنظیمات استفاده کرد:

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

یک رابط کاربری صفحه صوتی را پیاده سازی کنید

هنگامی که یک VoiceInteractionSession یک پاسخ onShow() دریافت می کند، می تواند یک رابط کاربری صفحه صوتی را ارائه دهد. برای دستورالعمل‌های بصری و UX در مورد پیاده‌سازی صفحه صوتی، به دستیاران از پیش بارگذاری شده: راهنمای UX مراجعه کنید.

نمایش صفحه صوتی

شکل 6. نمایش صفحه صوتی

دو گزینه برای نحوه پیاده سازی این UI وجود دارد:

  • لغو VoiceInteractionSession#onCreateContentView()
  • یک فعالیت را با استفاده از VoiceInteractionSession#startAssistantActivity() راه اندازی کنید

استفاده از onCreateContentView()

این روش پیش فرض ارائه صفحه صوتی است. کلاس پایه VoiceInteractionSession یک پنجره ایجاد می کند و چرخه عمر آن را تا زمانی که یک جلسه صوتی زنده است مدیریت می کند. برنامه‌ها باید VoiceInteractionSession#onCreateContentView() را لغو کنند و به محض ایجاد جلسه، نمای پیوست شده به آن پنجره را برگردانند. این نما در ابتدا باید نامرئی باشد. هنگامی که یک تعامل صوتی شروع می شود، این نمای باید در VoiceInteractionSession#onShow() قابل مشاهده باشد و سپس دوباره در VoiceInteractionSession#onHide() نامرئی شود.

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);
    }
    …
}

هنگام استفاده از این روش، ممکن است بخواهید VoiceInteractionSession#onComputeInsets() برای در نظر گرفتن مناطق مبهم رابط کاربری خود تنظیم کنید.

استفاده از startAssistantActivity()

در این مورد، VoiceInteractionSession مدیریت رابط کاربری صفحه صوتی را به یک فعالیت معمولی واگذار می کند. هنگامی که این گزینه استفاده می شود، پیاده سازی VoiceInteractionSession باید ایجاد پنجره محتوای پیش فرض خود را غیرفعال کند ( به استفاده از onCreateContentView() ) در پاسخ به تماس onPrepareShow() مراجعه کنید. در VoiceInteractionSession#onShow() ، جلسه فعالیت صفحه صوتی را با استفاده از VoiceInteractionSession#startAssistantActivity() شروع می کند. این روش رابط کاربری را با تنظیمات مناسب پنجره و پرچم‌های فعالیت شروع می‌کند.

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

    …
}

برای حفظ ارتباط بین این فعالیت و VoiceInteractionSession ، ممکن است به مجموعه ای از Intent های داخلی یا اتصال سرویس نیاز باشد. به عنوان مثال، هنگامی که VoiceInteractionSession#onHide() فراخوانی می شود، جلسه باید بتواند این درخواست را به اکتیویتی ارسال کند.

مهم. در Automotive، فقط فعالیت‌ها یا فعالیت‌های مشروح ویژه فهرست‌شده در «لیست مجاز» UXR می‌توانند هنگام رانندگی نمایش داده شوند. این برای فعالیت‌هایی که با VoiceInteractionSession#startAssistantActivity() شروع شده‌اند نیز صدق می‌کند. به یاد داشته باشید که فعالیت خود را با <meta-data android:name="distractionOptimized" android:value="true"/> حاشیه نویسی کنید یا این فعالیت را در کلید systemActivityWhitelist /packages/services/Car/service/res/values/config.xml بگنجانید. فایل /packages/services/Car/service/res/values/config.xml . برای اطلاعات بیشتر، دستورالعمل‌های حواس‌پرتی راننده را ببینید.

تشخیص صدا را پیاده سازی کنید

در این بخش، نحوه پیاده سازی تشخیص صدا از طریق تشخیص و شناسایی کلمات کلیدی را یاد می گیرید. کلمه کلیدی یک کلمه محرک است که برای شروع یک پرس و جو یا اقدام جدید به صورت صوتی استفاده می شود. برای مثال، «OK Google» یا «Hey Google».

تشخیص کلید واژه DSP

اندروید با استفاده از AlwaysOnHotwordDetector دسترسی به آشکارساز کلمه کلیدی همیشه روشن در سطح DSP را فراهم می کند. روشی برای پیاده سازی تشخیص کلمه کلیدی با CPU پایین. استفاده از این قابلیت به دو بخش تقسیم می شود:

  • نمونه‌سازی یک AlwaysOnHotwordDetector .
  • ثبت نام مدل صدای تشخیص کلمه کلیدی.

پیاده‌سازی VoiceInteractionService می‌تواند با استفاده از VoiceInteractionService#createAlwaysOnHotwordDetector() یک آشکارساز کلمه کلیدی ایجاد کند و یک عبارت کلیدی و محلی را که می‌خواهند برای شناسایی استفاده کنند، ارسال می‌کند. در نتیجه، برنامه یک پاسخ onAvailabilityChanged() با یکی از مقادیر ممکن زیر دریافت می کند:

  • STATE_HARDWARE_UNAVAILABLE . قابلیت DSP در دستگاه موجود نیست. در این مورد از تشخیص کلید واژه نرم افزار استفاده می شود.
  • STATE_HARDWARE_UNSUPPORTED . پشتیبانی DSP به طور کلی در دسترس نیست، اما DSP از ترکیب عبارت کلیدی و محلی پشتیبانی نمی‌کند. این برنامه می‌تواند از «تشخیص کلمه کلیدی نرم‌افزار» استفاده کند.
  • STATE_HARDWARE_ENROLLED . تشخیص کلمه داغ آماده است و می توان با فراخوانی متد startRecognition() شروع کرد.
  • STATE_HARDWARE_UNENROLLED . مدل صوتی برای عبارت کلیدی درخواستی موجود نیست، اما ثبت نام امکان پذیر است.

ثبت‌نام مدل‌های صوتی تشخیص کلمه کلیدی را می‌توان با استفاده از IVoiceInteractionManagerService#updateKeyphraseSoundModel() انجام داد. چندین مدل را می توان در یک زمان معین در سیستم ثبت کرد، اما تنها یک مدل با AlwaysOnHotwordDetector مرتبط است. تشخیص کلید واژه DSP ممکن است در همه دستگاه‌ها در دسترس نباشد. توسعه دهندگان VIA باید قابلیت های سخت افزار را با استفاده از متد getDspModuleProperties() بررسی کنند. برای نمونه کدی که نحوه ثبت‌نام مدل‌های صدا را نشان می‌دهد، به VoiceEnrollment/src/com/android/test/voiceenrollment/EnrollmentUtil.java مراجعه کنید. به ضبط همزمان در مورد تشخیص کلمه کلیدی همزمان مراجعه کنید.

تشخیص کلمه کلیدی نرم افزار

همانطور که در بالا اشاره شد، تشخیص کلید واژه DSP ممکن است در همه دستگاه‌ها در دسترس نباشد (به عنوان مثال، شبیه‌ساز Android شبیه‌سازی DSP را ارائه نمی‌دهد). در این حالت، تشخیص صدای نرم افزاری تنها راه حل است. برای جلوگیری از تداخل با سایر برنامه‌هایی که ممکن است نیاز به دسترسی به میکروفون داشته باشند، VIA باید با استفاده از:

هر دوی این ثابت ها @hide هستند و فقط برای برنامه های همراه در دسترس هستند.

ورودی صدا و تشخیص صدا را مدیریت کنید

ورودی صوتی با استفاده از کلاس MediaRecorder پیاده سازی می شود. برای اطلاعات بیشتر در مورد نحوه استفاده از این API، به نمای کلی MediaRecorder مراجعه کنید. همچنین انتظار می‌رود که خدمات تعامل صوتی، پیاده‌سازی کلاس RecognitionService باشند. هر برنامه ای در سیستم که به تشخیص صدا نیاز دارد برای دسترسی به این قابلیت از آن استفاده می کند. برای انجام تشخیص صدا و دسترسی به میکروفون، VIAها باید android.permission.RECORD_AUDIO نگه دارند. انتظار می رود برنامه هایی که به اجرای RecognitionService دسترسی دارند، این مجوز را نیز داشته باشند.

قبل از اندروید 10، دسترسی میکروفون تنها به یک برنامه در یک زمان داده می شد (به استثنای تشخیص کلمه کلیدی، به بالا مراجعه کنید). با شروع Android 10، دسترسی میکروفون را می توان به اشتراک گذاشت. برای اطلاعات بیشتر به اشتراک گذاری ورودی صوتی مراجعه کنید.

دسترسی به خروجی صدا

هنگامی که VIA آماده ارائه پاسخ های شفاهی است، پیروی از مجموعه دستورالعمل های بعدی مهم است: