การพัฒนาแอป

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

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

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 มีเมธอด Callback จำนวนมากที่ ดังที่อธิบายในส่วนต่อไปนี้ ดูรายการทั้งหมดในเอกสารสำหรับ VoiceInteractionSession

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

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

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

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

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

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

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

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

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

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

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

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

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

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

วิธีการทำงานมีดังนี้

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

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

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

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

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

สิทธิ์ที่ VIA ต้องมีจะแบ่งออกเป็น 3 หมวดหมู่ ดังนี้

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

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

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

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

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

ขอสิทธิ์

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

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

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

  • (ไม่บังคับ) ตรวจสอบว่ามี Listener การแจ้งเตือนล่วงหน้าหรือไม่โดยใช้ 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 กำลังแสดงแผ่นเสียง

การใช้ UI นี้มี 2 ตัวเลือก ได้แก่

  • ลบล้าง 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() Callback เวลา 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" หรือ "Ok Google"

การตรวจจับคำสั่งให้ดำเนินการ DSP

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

  • การสร้าง AlwaysOnHotwordDetector ให้เป็นอินสแตนซ์
  • การลงทะเบียนรูปแบบเสียงการตรวจจับคำสั่งให้ดำเนินการ

การใช้งาน VoiceInteractionService สามารถสร้างตัวตรวจจับคำสั่งให้ดำเนินการได้โดยใช้ VoiceInteractionService#createAlwaysOnHotwordDetector(), ผ่านวลีคีย์เวิร์ดและภาษาที่ต้องการใช้ในการตรวจจับ ด้วยเหตุนี้ ฟิลด์ แอปจะได้รับ onAvailabilityChanged() Callback ที่มีค่าที่เป็นไปได้ค่าใดค่าหนึ่งต่อไปนี้

  • STATE_HARDWARE_UNAVAILABLE ความสามารถของ DSP ไม่พร้อมใช้งานบน อุปกรณ์ ในกรณีนี้จะใช้การตรวจหาคำสั่งให้ดำเนินการของซอฟต์แวร์
  • STATE_HARDWARE_UNSUPPORTED ไม่มีการสนับสนุน DSP โดยทั่วไป แต่ DSP ไม่รองรับการใช้วลีคีย์เวิร์ดและภาษาร่วมกันที่กำหนด แอปสามารถเลือกใช้ การตรวจหาคำสั่งให้ดำเนินการของซอฟต์แวร์
  • STATE_HARDWARE_ENROLLED การตรวจหาคำที่นิยมพร้อมใช้งานและสามารถเริ่มต้นได้โดย ซึ่งเรียกใช้เมธอด startRecognition()
  • STATE_HARDWARE_UNENROLLED รูปแบบเสียงสำหรับวลีคีย์เวิร์ดที่ขอไม่ใช่ พร้อมใช้งาน แต่ยังสามารถลงทะเบียนได้

ลงทะเบียนโมเดลเสียงการตรวจจับคำสั่งให้ดำเนินการได้โดยใช้ IVoiceInteractionManagerService#updateKeyphraseSoundModel() สามารถลงทะเบียนโมเดลได้หลายโมเดลในระบบในช่วงเวลาหนึ่งๆ แต่จะมีได้เพียงโมเดลเดียวเท่านั้น โมเดลเชื่อมโยงกับ AlwaysOnHotwordDetector การตรวจหาคำสั่งให้ดำเนินการใน DSP อาจไม่พร้อมใช้งานในบางอุปกรณ์ ผ่านนักพัฒนาซอฟต์แวร์ ควรตรวจสอบความสามารถของฮาร์ดแวร์โดยใช้ 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 พร้อมที่จะให้บริการด้วยวาจา เป็นสิ่งสำคัญที่ ให้ทำตามหลักเกณฑ์ชุดถัดไปนี้

  • เมื่อขอโฟกัสเสียงหรือจัดการเอาต์พุตเสียง แอป ต้องใช้ AudioAttributes#USAGE_ASSISTANT และ AudioAttributes#CONTENT_TYPE_SPEECH เป็นแอตทริบิวต์เสียง
  • ในระหว่างการจดจำคำพูด จะต้องขอการโฟกัสเสียงด้วย AudioManage#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE โปรดทราบว่าแอปสื่อบางแอปอาจตอบสนองคำสั่งสื่อไม่ถูกต้อง (ดู Fulfilling Media Commands) ขณะที่เสียง โฟกัสถูกนำออก