การพัฒนาแอป

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ขั้นตอนการทำงานมีดังนี้

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

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

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

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

การตั้งค่าในการใช้งานครั้งแรก

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

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

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

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

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

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

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

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

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

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

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

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

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

  • สิทธิ์การรับรองระบบ สิทธิ์เหล่านี้จะมอบให้กับ APK ที่ติดตั้งไว้ล่วงหน้าและรับรองโดยระบบเท่านั้น ผู้ใช้ไม่สามารถให้สิทธิ์เหล่านี้ได้ มีเพียง OEM เท่านั้นที่ให้สิทธิ์เหล่านั้นได้เมื่อสร้างอิมเมจระบบ ดูข้อมูลเพิ่มเติมเกี่ยวกับการรับสิทธิ์การรับรองได้ที่หัวข้อให้สิทธิ์ที่มีสิทธิ์ระดับระบบ
  • สิทธิ์ที่เป็นอันตราย สิทธิ์เหล่านี้คือสิทธิ์ที่ผู้ใช้ต้องมอบโดยใช้กล่องโต้ตอบ PermissionsController OEM สามารถให้สิทธิ์บางอย่างเหล่านี้แก่ 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);
}

ใช้ UI ของเพลตเสียง

เมื่อ VoiceInteractionSession ได้รับ onShow() ติดต่อกลับ VoiceInteractionSession จะแสดง 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 ด้วยการตั้งค่าหน้าต่างและ Flag กิจกรรมที่เหมาะสม

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() callbacks ที่มีค่าที่เป็นไปได้ค่าใดค่าหนึ่งต่อไปนี้

  • 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 พร้อมที่จะให้คำตอบด้วยวาจา คุณควรทำตามหลักเกณฑ์ชุดถัดไปนี้