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