تطوير التطبيقات

لتنفيذ تطبيق التفاعل الصوتي (VIA)، عليك إكمال الخطوات التالية:

  1. إنشاء هيكل عظمي VIA.
  2. ( اختياري ) قم بتنفيذ عملية الإعداد/تسجيل الدخول.
  3. ( اختياري ) تنفيذ شاشة الإعدادات.
  4. قم بتعريف الأذونات المطلوبة في ملف البيان.
  5. تنفيذ واجهة مستخدم لوحة الصوت.
  6. تنفيذ التعرف على الصوت (يجب أن يتضمن تنفيذ RecognitionService API).
  7. تنفيذ الكلام (اختياريًا، يمكنك تنفيذ TextToSpeech API).
  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>

في هذا المثال:

  • يجب أن تعرض VIAs خدمة تعمل على توسيع 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() للتعامل مع ميزة النقر للقراءة في Voice Assistant . يستخدم النظام VoiceInteractionSessionService لإنشاء جلسة VoiceInteractionSession والتفاعل معها. إنها تتحمل مسؤولية واحدة فقط، وهي بدء جلسات جديدة عند الطلب.

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

وأخيرًا، جلسة VoiceInteraction هي المكان الذي سيتم فيه إنجاز معظم العمل. يمكن إعادة استخدام مثيل جلسة واحدة لإكمال تفاعلات مستخدم متعددة. في 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 دون طلب صريح من المستخدم. وهذا يعني أن VIAs يجب أن تتجنب عرض المحتوى تلقائيًا على وحدة المعالجة المركزية أثناء تشغيل الجهاز أو كنتيجة لتبديل المستخدم أو إلغاء القفل.

تذكير الإخطار

يُعد تذكير الإشعارات طريقة غير تدخلية للإشارة إلى الحاجة إلى الإعداد، ولتزويد المستخدمين بإمكانية الانتقال إلى تدفق إعداد المساعد.

تذكير الإخطار

الشكل 2. تذكير الإخطار

إليك كيفية عمل هذا التدفق:

تدفق تذكير الإخطار

الشكل 3. تدفق تذكير الإخطار

الرد الصوتي

هذا هو أبسط تدفق للتنفيذ، حيث يبدأ كلامًا في رد اتصال VoiceInteractionSession#onShow() ، ويشرح للمستخدم ما يجب القيام به، ثم يسأله (إذا كان الإعداد مسموحًا به في ظل حالة تقييد UX) إذا كان يريد البدء تدفق الإعداد. إذا لم يكن الإعداد ممكنًا في ذلك الوقت، فاشرح هذا الموقف أيضًا.

الإعداد عند الاستخدام الأول

من الممكن دائمًا للمستخدم تشغيل VIA لم يتم تكوينه بشكل صحيح. في حالات كهذه:

  1. أخبر المستخدم شفهيًا بهذا الموقف (على سبيل المثال، "للعمل بشكل صحيح، أريد منك إكمال بعض الخطوات ...").
  2. إذا كان محرك قيود UX يسمح بذلك (راجع UX_RESTRICTIONS_NO_SETUP )، فاسأل المستخدم عما إذا كان يريد بدء عملية الإعداد ثم افتح شاشة الإعدادات الخاصة بـ VIA.
  3. بخلاف ذلك (على سبيل المثال، إذا كان المستخدم يقود السيارة)، اترك إشعارًا للمستخدم للنقر على الخيار عندما يكون ذلك آمنًا.

بناء شاشات إعداد التفاعل الصوتي

ينبغي تطوير شاشات الإعداد وتسجيل الدخول كأنشطة منتظمة. راجع تجربة المستخدم والإرشادات المرئية لتطوير واجهة المستخدم في المساعدين المحملين مسبقًا: إرشادات تجربة المستخدم .

إرشادات عامة:

  • يجب أن تسمح VIAs للمستخدمين بمقاطعة واستئناف الإعداد في أي وقت.
  • لا ينبغي السماح بالإعداد إذا كان تقييد UX_RESTRICTIONS_NO_SETUP ساري المفعول. للحصول على التفاصيل، راجع إرشادات تشتيت انتباه السائق .
  • يجب أن تتوافق شاشات الإعداد مع نظام التصميم الخاص بكل مركبة. يجب أن يكون تخطيط الشاشة العام والأيقونات والألوان والجوانب الأخرى متسقًا مع بقية واجهة المستخدم. راجع التخصيص للحصول على التفاصيل.

تنفيذ شاشة الإعدادات

تكامل الإعدادات

الشكل 4. تكامل الإعدادات

شاشات الإعدادات هي أنشطة Android المعتادة. إذا تم تنفيذها، فيجب الإعلان عن نقطة الإدخال الخاصة بهم في res/xml/interaction_service.xml كجزء من بيانات VIA (راجع البيانات ). يعد قسم الإعدادات مكانًا جيدًا لمواصلة الإعداد وتسجيل الدخول (إذا لم يكمله المستخدم) أو تقديم خيار تسجيل الخروج أو تبديل المستخدم إذا لزم الأمر. كما هو الحال مع شاشات الإعداد الموضحة أعلاه، يجب أن تكون هذه الشاشات:

  • قم بتوفير خيار الخروج مرة أخرى إلى الشاشة السابقة في حزمة الشاشة (على سبيل المثال، إلى إعدادات السيارة).
  • لا يجوز أثناء القيادة. للحصول على التفاصيل، راجع إرشادات تشتيت انتباه السائق .
  • تطابق كل نظام تصميم السيارة. للحصول على التفاصيل، راجع التخصيص .

قم بتعريف الأذونات المطلوبة في ملف البيان

يمكن تقسيم الأذونات المطلوبة بواسطة VIA إلى ثلاث فئات:

  • أذونات توقيع النظام. هذه الأذونات تُمنح فقط لملفات APK المثبتة مسبقًا والموقّعة من النظام. لا يستطيع المستخدمون منح هذه الأذونات، ويمكن لمصنعي المعدات الأصلية فقط منحها عند إنشاء صور النظام الخاصة بهم. لمزيد من المعلومات حول الحصول على أذونات التوقيع، راجع منح أذونات النظام المميزة .
  • أذونات خطيرة. هذه هي الأذونات التي يجب على المستخدم منحها باستخدام مربع الحوار PermissionsController. يمكن لمصنعي المعدات الأصلية منح بعض هذه الأذونات مسبقًا لخدمة 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() ، يمكنها تقديم واجهة مستخدم للوحة الصوت. للحصول على إرشادات مرئية وإرشادات تجربة المستخدم حول تنفيذ اللوحة الصوتية، راجع المساعدين المحملين مسبقًا: إرشادات تجربة المستخدم .

عرض لوحة الصوت

الشكل 6. عرض لوحة الصوت

هناك خياران حول كيفية تنفيذ واجهة المستخدم هذه:

  • تجاوز 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 ، قد تكون هناك حاجة إلى مجموعة من النوايا الداخلية أو ربط الخدمة. على سبيل المثال، عند استدعاء VoiceInteractionSession#onHide() ، يجب أن تكون الجلسة قادرة على تمرير هذا الطلب إلى النشاط.

مهم. في السيارات، يمكن فقط عرض الأنشطة المشروحة بشكل خاص أو الأنشطة المدرجة في "القائمة المسموح بها" لـ 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

يوفر Android إمكانية الوصول إلى كاشف الكلمات المهمة الذي يعمل دائمًا على مستوى DSP عن طريق AlwaysOnHotwordDetector . طريقة لتنفيذ الكشف عن الكلمات المهمة باستخدام وحدة المعالجة المركزية المنخفضة. ينقسم استخدام هذه الوظيفة إلى قسمين:

  • إنشاء مثيل لـ AlwaysOnHotwordDetector .
  • تسجيل نموذج صوتي للكشف عن الكلمات المهمة.

يمكن لتطبيق VoiceInteractionService إنشاء كاشف للكلمات المهمة باستخدام VoiceInteractionService#createAlwaysOnHotwordDetector() ، وتمرير العبارة الرئيسية واللغة التي يرغبون في استخدامها للكشف. ونتيجة لذلك، يتلقى التطبيق رد اتصال onAvailabilityChanged() بإحدى القيم المحتملة التالية:

  • STATE_HARDWARE_UNAVAILABLE . قدرة DSP غير متوفرة على الجهاز. في هذه الحالة، يتم استخدام اكتشاف الكلمات المهمة للبرنامج.
  • STATE_HARDWARE_UNSUPPORTED . لا يتوفر دعم DSP بشكل عام، لكن DSP لا يدعم مجموعة معينة من الكلمات الرئيسية والإعدادات المحلية. يمكن للتطبيق اختيار استخدام برنامج Hotword Detection .
  • STATE_HARDWARE_ENROLLED . أصبح اكتشاف الكلمات المهمة جاهزًا ويمكن البدء به عن طريق استدعاء الأسلوب startRecognition() .
  • STATE_HARDWARE_UNENROLLED . لا يتوفر نموذج صوتي للكلمة الرئيسية المطلوبة، ولكن التسجيل ممكن.

يمكن تسجيل النماذج الصوتية للكشف عن الكلمات المهمة باستخدام IVoiceInteractionManagerService#updateKeyphraseSoundModel() . يمكن تسجيل نماذج متعددة في النظام في وقت معين، ولكن يتم ربط نموذج واحد فقط بـ AlwaysOnHotwordDetector . قد لا يكون اكتشاف الكلمة المهمة لـ DSP متاحًا في جميع الأجهزة. يجب على مطوري VIA التحقق من إمكانيات الأجهزة باستخدام طريقة getDspModuleProperties() . للحصول على نموذج التعليمات البرمجية الذي يوضح كيفية تسجيل نماذج الصوت، راجع VoiceEnrollment/src/com/android/test/voiceenrollment/EnrollmentUtil.java . راجع الالتقاط المتزامن بخصوص التعرف على الكلمات المهمة المتزامنة.

كشف الكلمات المهمة للبرنامج

كما هو موضح أعلاه، قد لا يكون اكتشاف الكلمة المهمة لـ DSP متاحًا في جميع الأجهزة (على سبيل المثال، لا يوفر محاكي Android محاكاة DSP). وفي هذه الحالة، يعد برنامج التعرف على الصوت هو البديل الوحيد. لتجنب التداخل مع التطبيقات الأخرى التي قد تحتاج إلى الوصول إلى الميكروفون، يجب أن تصل VAs إلى إدخال الصوت باستخدام:

كلا هذين الثابتين هما @hide ومتاحان فقط للتطبيقات المجمعة.

إدارة إدخال الصوت والتعرف على الصوت

سيتم تنفيذ إدخال الصوت باستخدام فئة MediaRecorder . لمزيد من المعلومات حول كيفية استخدام واجهة برمجة التطبيقات هذه، راجع نظرة عامة على MediaRecorder . من المتوقع أيضًا أن تكون خدمات التفاعل الصوتي عبارة عن تطبيقات لفئة RecognitionService . يستخدم أي تطبيق في النظام يتطلب التعرف على الصوت للوصول إلى هذه الإمكانية. للقيام بالتعرف على الصوت والوصول إلى الميكروفون، يجب أن تحتوي VIAs على android.permission.RECORD_AUDIO . من المتوقع أن تحصل التطبيقات التي تصل إلى تطبيق RecognitionService على هذا الإذن أيضًا.

قبل Android 10، كان الوصول إلى الميكروفون متاحًا لتطبيق واحد فقط في كل مرة (باستثناء اكتشاف الكلمات المهمة، انظر أعلاه). بدءًا من Android 10، يمكن مشاركة الوصول إلى الميكروفون. لمزيد من المعلومات، راجع مشاركة إدخال الصوت .

الوصول إلى إخراج الصوت

عندما يكون VIA جاهزًا لتقديم ردود شفهية، فمن المهم اتباع هذه المجموعة التالية من الإرشادات: