การพัฒนาแอป

หากต้องการติดตั้งใช้งานแอปพลิเคชันการโต้ตอบด้วยเสียง (VIA) ให้ทำตามขั้นตอนต่อไปนี้

  1. สร้างโครงสร้างพื้นฐานของ VIA
  2. (ไม่บังคับ) ติดตั้งใช้งานขั้นตอนการตั้งค่า/ลงชื่อเข้าใช้
  3. (ไม่บังคับ) ติดตั้งใช้งานหน้าจอการตั้งค่า
  4. ประกาศสิทธิ์ที่จำเป็นในไฟล์ Manifest
  5. ติดตั้งใช้งาน UI ของแผ่นเสียง
  6. ติดตั้งใช้งานการจดจำเสียงพูด (ต้องมีการติดตั้งใช้งาน RecognitionService API)
  7. ติดตั้งใช้งานคำพูด (คุณสามารถติดตั้งใช้งาน TextToSpeech API ได้)
  8. ติดตั้งใช้งานการดำเนินการตามคำสั่ง ดูเนื้อหานี้ใน หัวข้อการดำเนินการตามคำสั่ง.

ส่วนต่อไปนี้จะอธิบายวิธีทำตามแต่ละขั้นตอนที่กล่าวถึงข้างต้น

สร้างโครงสร้างพื้นฐานของ VIA

Manifest

ระบบจะตรวจหาว่าแอปเป็นแอปที่มีการโต้ตอบด้วยเสียงเมื่อมีข้อมูลต่อไปนี้รวมอยู่ใน Manifest

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 ทั้งหมดเป็นบริการจดจำเสียงพูดด้วย คุณจึงต้องใส่ข้อมูลต่อไปนี้ใน Manifest ด้วย

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 นี้เป็น VIA ที่ใช้งานอยู่ เช่น การตรวจหาคำที่นิยม
  • รายงานการสั่งงานด้วยเสียงที่รองรับ (ดู การแตะเพื่ออ่านของผู้ช่วยแบบเสียง)
  • เปิดเซสชันการโต้ตอบด้วยเสียงจากหน้าจอล็อก (Keyguard)

การติดตั้งใช้งาน 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 ที่ยังไม่ได้กำหนดค่าอย่างถูกต้องได้เสมอ ซึ่งอาจเกิดขึ้นได้เนื่องจากสาเหตุต่อไปนี้

  • ผู้ใช้ข้ามตัวช่วยการตั้งค่าทั้งหมดหรือข้ามขั้นตอนการกำหนดค่าการโต้ตอบด้วยเสียง
  • ผู้ใช้เลือก VIA อื่นที่ไม่ใช่ VIA ที่กำหนดค่าไว้ระหว่างการเริ่มต้นใช้งานอุปกรณ์

ไม่ว่าในกรณีใด VoiceInteractionService มีหลายวิธีในการกระตุ้นให้ผู้ใช้ทำการตั้งค่าให้เสร็จสมบูรณ์

  • การช่วยเตือนแบบการแจ้งเตือน
  • การตอบกลับด้วยเสียงอัตโนมัติเมื่อผู้ใช้พยายามใช้

หมายเหตุ: เราไม่แนะนำอย่างยิ่งให้แสดงขั้นตอนการตั้งค่า VIA โดยไม่มีคำขอที่ชัดเจนจากผู้ใช้ ซึ่งหมายความว่า VIA ควรหลีกเลี่ยงการแสดงเนื้อหาบน HU โดยอัตโนมัติระหว่างการบูตอุปกรณ์หรือเป็นผลมาจากการสลับหรือปลดล็อกของผู้ใช้

การช่วยเตือนแบบการแจ้งเตือน

การช่วยเตือนแบบการแจ้งเตือนเป็นวิธีที่ไม่รบกวนในการระบุความจำเป็นในการตั้งค่า และให้ผู้ใช้มีโอกาสไปยังขั้นตอนการตั้งค่าผู้ช่วย

การช่วยเตือนการแจ้งเตือน

รูปที่ 2 การช่วยเตือนแบบการแจ้งเตือน

ขั้นตอนการทำงานจะเป็นดังนี้

ขั้นตอนการช่วยเตือน

รูปที่ 3 ขั้นตอนการช่วยเตือนแบบการแจ้งเตือน

การตอบกลับด้วยเสียง

นี่เป็นขั้นตอนที่ง่ายที่สุดในการติดตั้งใช้งาน โดยเริ่มคำพูดในการเรียกกลับ VoiceInteractionSession#onShow() อธิบายให้ผู้ใช้ทราบสิ่งที่ต้องทำ แล้วถามผู้ใช้ (หากได้รับอนุญาตให้ตั้งค่าตามสถานะการจำกัด UX) ว่าต้องการเริ่มขั้นตอนการตั้งค่าหรือไม่ หากตั้งค่าไม่ได้ในขณะนั้น ให้แจ้งสถานการณ์นี้ด้วย

การตั้งค่าเมื่อใช้งานครั้งแรก

ผู้ใช้สามารถทริกเกอร์ VIA ที่ยังไม่ได้กำหนดค่าอย่างถูกต้องได้เสมอ ในกรณีดังกล่าว ให้ทำดังนี้

  1. แจ้งให้ผู้ใช้ทราบสถานการณ์นี้ด้วยวาจา (เช่น "ฉันต้องให้คุณทำตามขั้นตอน 2-3 ขั้นตอนเพื่อให้ทำงานได้อย่างถูกต้อง…")
  2. หากเครื่องมือการจำกัด UX อนุญาต (ดู UX_RESTRICTIONS_NO_SETUP) ให้ถามผู้ใช้ว่าต้องการเริ่ม กระบวนการตั้งค่าหรือไม่ แล้วเปิดหน้าจอการตั้งค่าสำหรับ VIA
  3. หากไม่ได้รับอนุญาต (เช่น หากผู้ใช้กำลังขับรถ) ให้แสดงการแจ้งเตือนเพื่อให้ผู้ใช้คลิกตัวเลือกเมื่อปลอดภัยที่จะทำ

สร้างหน้าจอการตั้งค่าการโต้ตอบด้วยเสียง

คุณควรพัฒนาหน้าจอการตั้งค่าและการลงชื่อเข้าใช้เป็น กิจกรรมปกติ ดูหลักเกณฑ์ด้าน UX และภาพสำหรับการพัฒนา UI ได้ที่ คำแนะนำ UX สำหรับผู้ช่วยที่โหลดไว้ล่วงหน้า

หลักเกณฑ์ทั่วไป

  • VIA ควรอนุญาตให้ผู้ใช้ขัดจังหวะและดำเนินการตั้งค่าต่อได้ทุกเมื่อ
  • ไม่ควรอนุญาตให้ตั้งค่าหากมีการจำกัด UX_RESTRICTIONS_NO_SETUP ดูรายละเอียดได้ที่ หลักเกณฑ์การเสียสมาธิของผู้ขับ
  • หน้าจอการตั้งค่าควรเป็นไปตามระบบการออกแบบของรถแต่ละรุ่น เลย์เอาต์หน้าจอทั่วไป ไอคอน สี และลักษณะอื่นๆ ควรสอดคล้องกับ UI ส่วนอื่นๆ ดูรายละเอียดได้ที่ การปรับแต่ง

ติดตั้งใช้งานหน้าจอการตั้งค่า

การผสานรวมการตั้งค่า

รูปที่ 4 การผสานรวมการตั้งค่า

หน้าจอการตั้งค่าเป็นกิจกรรม Android ปกติ หากมีการติดตั้งใช้งาน จุดเริ่มต้นของหน้าจอการตั้งค่า ต้องประกาศไว้ใน res/xml/interaction_service.xml ซึ่งเป็นส่วนหนึ่งของ Manifest ของ VIA (ดู Manifest) ส่วนการตั้งค่าเป็นตำแหน่งที่เหมาะสมในการตั้งค่าและลงชื่อเข้าใช้ต่อ (หากผู้ใช้ยังไม่ได้ดำเนินการให้เสร็จสมบูรณ์) หรือเสนอตัวเลือก ลงชื่อออก หรือ เปลี่ยนผู้ใช้ หากจำเป็น หน้าจอเหล่านี้ควรมีลักษณะดังนี้

  • มีตัวเลือกให้ออกจากหน้าจอปัจจุบันกลับไปยังหน้าจอก่อนหน้าในสแต็กหน้าจอ (เช่น ไปที่การตั้งค่ารถ)
  • ไม่ได้รับอนุญาตขณะขับรถ ดูรายละเอียดได้ที่ หลักเกณฑ์การเสียสมาธิของผู้ขับ
  • เป็นไปตามระบบการออกแบบของรถแต่ละรุ่น ดูรายละเอียดได้ที่ การปรับแต่ง

ประกาศสิทธิ์ที่จำเป็นในไฟล์ Manifest

สิทธิ์ที่ VIA ต้องใช้สามารถแบ่งออกเป็น 3 หมวดหมู่

  • สิทธิ์ลายเซ็นระบบ สิทธิ์เหล่านี้จะมอบให้เฉพาะ APK ที่ติดตั้งไว้ล่วงหน้าและลงนามโดยระบบเท่านั้น ผู้ใช้ไม่สามารถให้สิทธิ์เหล่านี้ได้ มีเพียง OEM เท่านั้นที่ให้สิทธิ์ได้เมื่อสร้างอิมเมจระบบ ดูข้อมูลเพิ่มเติมเกี่ยวกับการขอสิทธิ์ลายเซ็นได้ที่ ให้สิทธิ์ที่มีสิทธิพิเศษของระบบ
  • สิทธิ์ที่เป็นอันตราย สิทธิ์เหล่านี้เป็นสิทธิ์ที่ผู้ใช้ต้องให้โดยใช้กล่องโต้ตอบ PermissionsController OEM สามารถให้สิทธิ์บางอย่างเหล่านี้ล่วงหน้าแก่ VoiceInteractionService เริ่มต้นได้ แต่เนื่องจากค่าเริ่มต้นนี้อาจเปลี่ยนแปลงไปในอุปกรณ์แต่ละเครื่อง แอปจึงควรขอสิทธิ์เหล่านี้ได้เมื่อจำเป็น
  • สิทธิ์อื่นๆ สิทธิ์เหล่านี้เป็นสิทธิ์อื่นๆ ทั้งหมดที่ไม่ต้องมีการดำเนินการจากผู้ใช้ ระบบจะให้สิทธิ์เหล่านี้โดยอัตโนมัติ

จากข้อมูลข้างต้น ส่วนต่อไปนี้จะเน้นเฉพาะการขอสิทธิ์ที่เป็นอันตราย ควรขอสิทธิ์เฉพาะในขณะที่ผู้ใช้อยู่ในหน้าจอการลงชื่อเข้าใช้หรือการตั้งค่า

หากแอปไม่มีสิทธิ์ที่จำเป็นในการทำงาน ขั้นตอนที่แนะนำคือใช้คำพูดเพื่ออธิบายสถานการณ์ให้ผู้ใช้ทราบ และใช้การแจ้งเตือนเพื่อให้ผู้ใช้มีโอกาสกลับไปที่หน้าจอการตั้งค่า VIA ดูรายละเอียดได้ที่ 1. การช่วยเตือนแบบการแจ้งเตือน

ขอสิทธิ์เป็นส่วนหนึ่งของหน้าจอการตั้งค่า

คุณขอสิทธิ์ที่เป็นอันตรายได้โดยใช้เมธอด ActivityCompat#requestPermission() ปกติ (หรือเมธอดที่เทียบเท่า) ดูรายละเอียดเกี่ยวกับวิธีขอสิทธิ์ได้ที่ ขอสิทธิ์ของแอป

ขอสิทธิ์

รูปที่ 5 ขอสิทธิ์

สิทธิ์ผู้ฟังการแจ้งเตือน

หากต้องการติดตั้งใช้งานขั้นตอน TTR นั้น VIA ต้องได้รับการกำหนดให้เป็นผู้ฟังการแจ้งเตือน ซึ่งไม่ใช่สิทธิ์โดยตัวมันเอง แต่เป็นการกำหนดค่าที่อนุญาตให้ระบบส่งการแจ้งเตือนไปยังผู้ฟังที่ลงทะเบียนไว้ หากต้องการทราบว่า VIA ได้รับสิทธิ์เข้าถึงข้อมูลนี้หรือไม่ แอปสามารถทำดังนี้

  • (ไม่บังคับ) ตรวจสอบว่ามีผู้ฟังการแจ้งเตือนล่วงหน้าหรือไม่โดยใช้ CarAssistUtils#assistantIsNotificationListener() ซึ่งสามารถทำได้ เช่น ระหว่างขั้นตอนการตั้งค่า
  • (บังคับ) ตอบสนองต่อการจัดการ CarVoiceInteractionSession#onShow() ด้วยการดำเนินการ VOICE_ACTION_HANDLE_EXCEPTION และข้อยกเว้น EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING

หากไม่ได้ให้สิทธิ์เข้าถึงนี้ล่วงหน้า VIA ควรนำผู้ใช้ไปยังส่วนการเข้าถึงการแจ้งเตือนของการตั้งค่ารถ โดยใช้คำพูดและการแจ้งเตือนร่วมกัน คุณสามารถใช้โค้ดต่อไปนี้เพื่อเปิดส่วนที่เหมาะสมของแอปการตั้งค่า

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

ติดตั้งใช้งาน UI ของแผ่นเสียง

เมื่อ VoiceInteractionSession ได้รับการเรียกกลับ onShow() ก็จะแสดง UI ของแผ่นเสียงได้ ดูหลักเกณฑ์ด้านภาพและ UX เกี่ยวกับการติดตั้งใช้งานแผ่นเสียงได้ที่ คำแนะนำ UX สำหรับผู้ช่วยที่โหลดไว้ล่วงหน้า

การแสดงเพลตเสียง

รูปที่ 6 การแสดงแผ่นเสียง

คุณมีตัวเลือก 2 ตัวเลือกในการติดตั้งใช้งาน 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() เพื่อพิจารณาพื้นที่ที่ถูกบดบังของ UI

ใช้ startAssistantActivity()

ในกรณีนี้ VoiceInteractionSession จะมอบหมายการจัดการ UI ของแผ่นเสียงให้กับกิจกรรมปกติ เมื่อใช้ตัวเลือกนี้ การติดตั้งใช้งาน VoiceInteractionSession ต้องปิดใช้การสร้างหน้าต่างเนื้อหาเริ่มต้น (ดู การใช้ onCreateContentView()) ในการเรียกกลับ onPrepareShow() ใน VoiceInteractionSession#onShow() เซสชันจะเริ่มกิจกรรมแผ่นเสียงโดยใช้ VoiceInteractionSession#startAssistantActivity() เมธอดนี้จะเริ่มต้น UI ด้วยการตั้งค่าหน้าต่างและแฟล็กกิจกรรมที่เหมาะสม

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

    
}

คุณอาจต้องใช้ชุด Intent ภายในหรือการผูกบริการเพื่อรักษาการสื่อสารระหว่างกิจกรรมนี้กับ VoiceInteractionSession เช่น เมื่อมีการเรียกใช้ VoiceInteractionSession#onHide() เซสชันต้องส่งคำขอนี้ไปยังกิจกรรมได้

สำคัญ ในยานยนต์ เฉพาะกิจกรรมที่มีคำอธิบายประกอบพิเศษหรือกิจกรรมที่แสดงอยู่ใน "รายการที่อนุญาต" ของ UXR เท่านั้นที่จะแสดงขณะขับรถ ซึ่งใช้กับกิจกรรมที่เริ่มด้วย VoiceInteractionSession#startAssistantActivity() ด้วย อย่าลืม ใส่คำอธิบายประกอบกิจกรรมด้วย <meta-data android:name="distractionOptimized" android:value="true"/> หรือรวมกิจกรรมนี้ ไว้ในคีย์ systemActivityWhitelist ของ /packages/services/Car/service/res/values/config.xml ไฟล์ ดูข้อมูลเพิ่มเติมได้ที่ หลักเกณฑ์การรบกวน ผู้ขับขี่

ติดตั้งใช้งานการจดจำเสียงพูด

ในส่วนนี้ คุณจะได้เรียนรู้วิธีติดตั้งใช้งานการจดจำเสียงพูดผ่านการตรวจหาและการจดจำคำที่นิยม คำที่นิยม คือคำทริกเกอร์ที่ใช้เพื่อเริ่มคำค้นหาหรือการดำเนินการใหม่ด้วยเสียง เช่น "Ok Google"

การตรวจหาคำที่นิยมของ DSP

Android ให้สิทธิ์เข้าถึงตัวตรวจหาคำที่นิยม แบบเปิดตลอดเวลา ที่ระดับ DSP ผ่าน AlwaysOnHotwordDetector วิธีติดตั้งใช้งานการตรวจหาคำที่นิยมโดยใช้ CPU ต่ำ การใช้ฟังก์ชันนี้แบ่งออกเป็น 2 ส่วน

  • การสร้างอินสแตนซ์ของ 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 ต้องเข้าถึงอินพุตเสียงโดยใช้ข้อมูลต่อไปนี้เพื่อหลีกเลี่ยงการรบกวนแอปอื่นๆ ที่อาจต้องเข้าถึงไมโครโฟน

ค่าคงที่ทั้ง 2 รายการนี้เป็น @hide และใช้ได้เฉพาะกับแอปที่มาพร้อมกับระบบเท่านั้น

จัดการอินพุตเสียงและการจดจำเสียงพูด

คุณจะติดตั้งใช้งานอินพุตเสียงโดยใช้คลาส MediaRecorder ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ API นี้ได้ที่ภาพรวม ของ MediaRecorder นอกจากนี้ บริการการโต้ตอบด้วยเสียงควรเป็นการติดตั้งใช้งานคลาส RecognitionService ด้วย แอปใดก็ตามในระบบที่ต้องใช้การจดจำเสียงพูดจะใช้ `[SpeechRecognizer](https://developer.android.com/reference/android/speech/SpeechRecognizer)` เพื่อเข้าถึงความสามารถนี้ หากต้องการจดจำเสียงพูดและเข้าถึงไมโครโฟนได้ VIAs ต้องมีสิทธิ์ android.permission.RECORD_AUDIO แอปที่เข้าถึงการติดตั้งใช้งาน RecognitionService ควรมีสิทธิ์นี้ด้วย

ก่อน Android 10 ระบบจะให้สิทธิ์เข้าถึงไมโครโฟนแก่แอปเพียงแอปเดียวในแต่ละครั้ง (ยกเว้นการตรวจหาคำที่นิยม ดูด้านบน) ตั้งแต่ Android 10 เป็นต้นไป คุณจะแชร์สิทธิ์เข้าถึงไมโครโฟนได้ ดูข้อมูลเพิ่มเติมได้ที่ การแชร์ อินพุตเสียง

เข้าถึงเอาต์พุตเสียง

เมื่อ VIA พร้อมที่จะให้การตอบกลับด้วยวาจา คุณควรทำตามหลักเกณฑ์ชุดต่อไปนี้