توسعه برنامه

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

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

بخش‌های بعدی نحوه انجام هر مرحله ذکر شده در بالا را شرح می‌دهند.

ایجاد اسکلت 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 ارث‌بری می‌کند، به همراه یک فیلتر intent برای اکشن 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)

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

چرخه‌های حیات

شکل ۱. چرخه‌های حیات

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

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

در نهایت، یک VoiceInteractionSession جایی است که بیشتر کارها در آن انجام می‌شود. یک نمونه session واحد ممکن است برای تکمیل تعاملات چندین کاربر مورد استفاده مجدد قرار گیرد. در 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 ای را انتخاب کند که به درستی پیکربندی نشده باشد. این اتفاق می‌تواند به دلایل زیر رخ دهد:

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

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

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

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

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

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

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

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

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

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

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

پاسخ صوتی

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

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

همیشه این امکان وجود دارد که کاربر یک VIA که به درستی پیکربندی نشده است را فعال کند. در چنین مواردی:

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

ساخت صفحات تنظیمات تعامل صوتی

صفحات راه‌اندازی و ورود به سیستم باید به عنوان فعالیت‌های منظم توسعه داده شوند. برای توسعه رابط کاربری، به دستورالعمل‌های UX و بصری در Preloaded Assistants: UX Guidance مراجعه کنید.

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

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

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

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

شکل ۴. یکپارچه‌سازی تنظیمات

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

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

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

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

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

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

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

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

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

درخواست مجوز

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

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

برای پیاده‌سازی جریان 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 در مورد پیاده‌سازی پلاک صوتی، به Preloaded Assistants: UX Guidance مراجعه کنید.

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

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

دو گزینه برای نحوه پیاده‌سازی این رابط کاربری وجود دارد:

  • نادیده گرفتن 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() فراخوانی می‌شود، session باید بتواند این درخواست را به اکتیویتی ارسال کند.

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

پیاده‌سازی تشخیص صدا

در این بخش، یاد می‌گیرید که چگونه تشخیص صدا را از طریق تشخیص و شناسایی کلمات کلیدی (hotwords) پیاده‌سازی کنید. کلمه کلیدی ، کلمه‌ای است که برای شروع یک پرس‌وجو یا اقدام جدید از طریق صدا استفاده می‌شود. به عنوان مثال، "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 مراجعه کنید. در مورد تشخیص کلمات کلیدی همزمان، به Concurrent capture مراجعه کنید.

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

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

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

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

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

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

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

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