หากต้องการใช้งานแอปพลิเคชันการโต้ตอบด้วยเสียง (VIA) ให้ทำตามขั้นตอนต่อไปนี้
- สร้างโครงร่าง VIA
- (ไม่บังคับ) ใช้ขั้นตอนการตั้งค่า/ลงชื่อเข้าใช้
- (ไม่บังคับ) สร้างหน้าจอการตั้งค่า
- ประกาศสิทธิ์ที่จำเป็นในไฟล์ Manifest
- ใช้ UI ของเพลตเสียง
- ติดตั้งใช้งานการจดจำเสียง (ต้องรวมการติดตั้งใช้งาน RecognitionService API)
- ใช้การออกเสียง (คุณจะใช้ TextToSpeech API ก็ได้)
- ใช้การดำเนินการตามคำสั่ง ดูเนื้อหานี้ใน การดำเนินการตามคำสั่ง
ส่วนต่อไปนี้จะอธิบายวิธีดำเนินการแต่ละขั้นตอนที่กล่าวถึงข้างต้น
สร้างโครงร่าง 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 ที่กำหนดค่าไม่ถูกต้องได้เสมอ ในกรณีดังกล่าว
- แจ้งให้ผู้ใช้ทราบสถานการณ์นี้ด้วยวาจา (เช่น "ฉันต้องการให้คุณทำตามขั้นตอนต่อไปนี้เพื่อให้ทำงานได้อย่างถูกต้อง … ")
- หากเครื่องมือการจำกัด UX อนุญาต (ดู UX_RESTRICTIONS_NO_SETUP) ให้ถามผู้ใช้ว่าต้องการเริ่ม กระบวนการตั้งค่าหรือไม่ แล้วเปิดหน้าจอการตั้งค่าสำหรับ VIA
- มิฉะนั้น (เช่น หากผู้ใช้กำลังขับรถ) ให้แสดงการแจ้งเตือนเพื่อให้ผู้ใช้ คลิกตัวเลือกเมื่อปลอดภัยที่จะทำเช่นนั้น
สร้างหน้าจอการตั้งค่าการโต้ตอบด้วยเสียง
ควรพัฒนาหน้าจอการตั้งค่าและการลงชื่อเข้าใช้เป็นกิจกรรมปกติ ดู หลักเกณฑ์ด้าน 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 ต้องเข้าถึงอินพุตเสียงโดยใช้สิ่งต่อไปนี้
- การบันทึกเสียงต้องใช้ MediaRecorder.AudioSource.HOTWORD
- ถือ
android.Manifest.permission.CAPTURE_AUDIO_HOTWORDสิทธิ์
ค่าคงที่ทั้ง 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โปรดทราบว่าแอปสื่อบางแอปอาจไม่ตอบสนองต่อคำสั่งสื่ออย่างถูกต้อง (ดูการดำเนินการตามคำสั่งสื่อ) ขณะที่ระบบนำโฟกัสเสียง ออก