การพัฒนาแอป

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

ใช้ขั้นตอนการตั้งค่า/ลงชื่อเข้าใช้

การตั้งค่าและการลงชื่อเข้าใช้จะเกิดขึ้นได้ในกรณีต่อไปนี้

  • ระหว่างการเริ่มต้นใช้งานอุปกรณ์ (วิซาร์ดการตั้งค่า)
  • ในระหว่างการสลับบริการโต้ตอบด้วยเสียง (การตั้งค่า)
  • เมื่อเปิดตัวครั้งแรกเมื่อเลือกแอป

ดูรายละเอียดเกี่ยวกับประสบการณ์ของผู้ใช้ที่แนะนำและคำแนะนำด้านภาพได้ที่ Assistant ที่โหลดไว้ล่วงหน้า: คำแนะนำด้าน UX

การตั้งค่าระหว่างการสลับบริการเสียง

ผู้ใช้เลือก VIA ที่กำหนดค่าไม่ถูกต้องได้เสมอ ซึ่งอาจเกิดขึ้นจากสาเหตุต่อไปนี้

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • สิทธิ์ลายเซ็นของระบบ สิทธิ์เหล่านี้ จะมอบให้เฉพาะ APK ที่ติดตั้งล่วงหน้าและ 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() VoiceInteractionSession จะแสดง UI เพลตเสียงได้ ดูหลักเกณฑ์ด้านภาพและ UX เกี่ยวกับการติดตั้งใช้งานเพลตเสียงได้ที่ Assistant ที่โหลดไว้ล่วงหน้า: คำแนะนำด้าน 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);
    }

    
}

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

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

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

ในส่วนนี้ คุณจะได้เรียนรู้วิธีใช้การจดจำเสียงพูดผ่านการตรวจหา และการจดจำคำสั่งเปิด คำสั่งเริ่มต้นคือคำที่ใช้เป็นทริกเกอร์เพื่อเริ่มการค้นหาหรือการดำเนินการใหม่ ด้วยเสียง เช่น "Ok Google" หรือ "Hey 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 แอปใดก็ตามในระบบที่ต้องใช้การจดจำเสียงจะใช้ เพื่อเข้าถึงความสามารถนี้ หากต้องการใช้การจดจำเสียงพูดและมีสิทธิ์เข้าถึงไมโครโฟน VIA ต้องมีandroid.permission.RECORD_AUDIO แอปที่เข้าถึงการใช้งาน RecognitionService จะต้องมีสิทธิ์นี้ด้วย

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

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

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