การพัฒนาแอป

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

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

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

สร้างโครงกระดูก VIA

ประจักษ์

แอปจะถูกตรวจพบว่าเป็นแอปที่มีการโต้ตอบด้วยเสียงเมื่อมีสิ่งต่อไปนี้รวมอยู่ในไฟล์ 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 โดยมีตัวกรองเจตนาสำหรับการดำเนินการ 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 นี้ยังคงใช้งานอยู่ เช่น การตรวจหาคำที่นิยม
  • รายงานการสั่งงานด้วยเสียงที่รองรับ (ดู Voice 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 Tap-to-Read ระบบใช้ 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 โดยอัตโนมัติระหว่างการบู๊ตอุปกรณ์หรือเป็นผลมาจากการสลับหรือปลดล็อคผู้ใช้

การแจ้งเตือน

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

การแจ้งเตือน

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

ต่อไปนี้เป็นวิธีการทำงานของโฟลว์นี้:

กระแสการแจ้งเตือน

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

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

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

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

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

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

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

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

แนวทางทั่วไป:

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

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

บูรณาการการตั้งค่า

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

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

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

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

สิทธิ์ที่ VIA ต้องการสามารถแบ่งออกเป็นสามประเภท:

  • สิทธิ์ลายเซ็นของระบบ สิทธิ์เหล่านี้เป็นสิทธิ์ที่มอบให้กับ 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 การแสดงแผ่นเสียง

มีสองตัวเลือกในการใช้งาน 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 ไฟล์ /packages/services/Car/service/res/values/config.xml สำหรับข้อมูลเพิ่มเติม โปรดดู หลักเกณฑ์การเสียสมาธิของผู้ขับขี่

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

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

การตรวจจับคำที่นิยม DSP

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

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

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

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

อินพุตเสียงจะถูกนำมาใช้โดยใช้ คลาส MediaRecorder สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ API นี้ โปรดดู ภาพรวม MediaRecorder บริการโต้ตอบด้วยเสียงยังคาดว่าจะเป็นการใช้งานคลาส RecognitionService แอพใดๆ ในระบบที่จำเป็นต้องมีการจดจำเสียงจะใช้ เพื่อเข้าถึงความสามารถนี้ หากต้องการจดจำเสียงและเข้าถึงไมโครโฟนได้ VIA จะต้องถือ android.permission.RECORD_AUDIO แอปที่เข้าถึงการใช้งาน RecognitionService จะต้องได้รับสิทธิ์นี้เช่นกัน

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

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

เมื่อ VIA พร้อมที่จะตอบกลับด้วยวาจา สิ่งสำคัญคือต้องปฏิบัติตามแนวปฏิบัติชุดถัดไปนี้: