Để triển khai Ứng dụng tương tác bằng giọng nói (VIA), bạn phải hoàn tất các bước sau:
- Tạo một bộ khung VIA.
- (không bắt buộc) Triển khai quy trình thiết lập/đăng nhập.
- (không bắt buộc) Triển khai màn hình Cài đặt.
- Khai báo các quyền bắt buộc trong tệp kê khai.
- Triển khai giao diện người dùng dạng bảng thoại.
- Triển khai tính năng nhận dạng giọng nói (phải bao gồm việc triển khai RecognitionService API).
- Triển khai câu nói (bạn có thể triển khai API TextToSpeech nếu muốn).
- Triển khai tính năng thực hiện lệnh. Xem nội dung này trong phần Thực hiện lệnh.
Các phần sau đây mô tả cách hoàn thành từng bước nêu trên.
Tạo bộ khung VIA
Tệp kê khai
Ứng dụng được phát hiện là ứng dụng có Tương tác bằng giọng nói khi có nội dung sau trong tệp kê khai:
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>
Trong ví dụ này:
- VIA phải hiển thị một dịch vụ mở rộng
VoiceInteractionService, có bộ lọc ý định cho thao tácVoiceInteractionService.SERVICE_INTERFACE ("android.service.voice.VoiceInteractionService"). - Dịch vụ này phải có quyền chữ ký hệ thống
BIND_VOICE_INTERACTION. - Dịch vụ này phải có một tệp siêu dữ liệu
android.voice_interactionđể chứa những nội dung sau: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" />
Để biết thông tin chi tiết về từng trường, hãy xem R.styleable#VoiceInteractionService.
Vì tất cả VIA cũng là dịch vụ nhận dạng giọng nói, nên bạn cũng phải thêm nội dung sau vào tệp kê khai:
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>
Dịch vụ nhận dạng giọng nói cũng yêu cầu đoạn siêu dữ liệu sau:
res/xml/recognition_service.xml
<recognition-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:settingsActivity="com.example.MyRecognizerSettingsActivity" />VoiceInteractionService, VoiceInteractionSessionService và VoiceInteractionSession
Sơ đồ sau đây mô tả vòng đời của từng thực thể này:

Hình 1. Lifecycles
Như đã đề cập trước đó, VoiceInteractionService là điểm truy cập vào VIA. Dịch vụ này có những trách nhiệm chính sau đây:
- Khởi động mọi quy trình cần được duy trì hoạt động chừng nào VIA này còn đang hoạt động. Ví dụ: tính năng phát hiện từ khoá.
- Báo cáo các thao tác bằng giọng nói được hỗ trợ (xem phần Tính năng Nhấn để đọc của Trợ lý giọng nói).
- Khởi chạy các phiên tương tác bằng giọng nói từ màn hình khoá (keyguard).
Ở dạng đơn giản nhất, một quy trình triển khai VoiceInteractionService sẽ trông như sau:
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; } ... }
Bạn phải triển khai VoiceInteractionService#onGetSupportedVoiceActions() để xử lý Tính năng nhấn để đọc của Trợ lý giọng nói.
Hệ thống dùng VoiceInteractionSessionService để tạo và tương tác với VoiceInteractionSession. Nó chỉ có một trách nhiệm là bắt đầu các phiên mới khi được yêu cầu.
public class MyVoiceInteractionSessionService extends VoiceInteractionSessionService { @Override public VoiceInteractionSession onNewSession(Bundle args) { return new MyVoiceInteractionSession(this); } }
Cuối cùng, VoiceInteractionSession là nơi hầu hết các thao tác sẽ được thực hiện. Một phiên duy nhất có thể được dùng lại để hoàn tất nhiều lượt tương tác của người dùng. Trong AAOS, có một hàm trợ giúp CarVoiceInteractionSession giúp triển khai một số chức năng riêng biệt của ô tô.
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 có một nhóm lớn các phương thức gọi lại được giải thích trong các phần sau. Hãy xem tài liệu về VoiceInteractionSession để biết danh sách đầy đủ.
Triển khai quy trình thiết lập/đăng nhập
Bạn có thể thiết lập và đăng nhập:
- Trong quá trình làm quen với thiết bị (Trình hướng dẫn thiết lập).
- Trong quá trình hoán đổi dịch vụ tương tác bằng giọng nói (Cài đặt).
- Khi người dùng chọn ứng dụng này trong lần đầu chạy.
Để biết thông tin chi tiết về trải nghiệm người dùng được đề xuất và hướng dẫn trực quan, hãy xem phần Trợ lý được tải sẵn: Hướng dẫn về trải nghiệm người dùng.
Thiết lập trong quá trình chuyển đổi dịch vụ thoại
Người dùng luôn có thể chọn một VIA chưa được định cấu hình đúng cách. Điều này có thể xảy ra vì:
- Người dùng đã bỏ qua hoàn toàn Trình hướng dẫn thiết lập hoặc người dùng đã bỏ qua bước định cấu hình tương tác bằng giọng nói.
- Người dùng đã chọn một VIA khác với VIA được định cấu hình trong quá trình thiết lập thiết bị.
Trong mọi trường hợp, VoiceInteractionService có một số cách để khuyến khích người dùng hoàn tất quá trình thiết lập:
- Lời nhắc thông báo.
- Tự động trả lời bằng giọng nói khi người dùng cố gắng sử dụng tính năng này.
Lưu ý: Bạn không nên trình bày quy trình thiết lập VIA mà không có yêu cầu rõ ràng của người dùng. Điều này có nghĩa là VIA không được tự động hiển thị nội dung trên HU trong quá trình khởi động thiết bị hoặc do người dùng chuyển đổi hoặc mở khoá.
Thông báo nhắc nhở
Lời nhắc thông báo là một cách không gây phiền toái để cho biết cần thiết lập và cung cấp cho người dùng một cách thức để chuyển đến quy trình thiết lập trợ lý.

Hình 2. Thông báo nhắc nhở
Quy trình này hoạt động như sau:

Hình 3. Quy trình nhắc nhở về thông báo
Trả lời bằng giọng nói
Đây là quy trình đơn giản nhất để triển khai, bắt đầu một câu lệnh trên lệnh gọi lại VoiceInteractionSession#onShow(), giải thích cho người dùng những việc cần làm, rồi hỏi họ (nếu được phép thiết lập theo trạng thái Hạn chế trải nghiệm người dùng) xem họ có muốn bắt đầu quy trình thiết lập hay không. Nếu không thể thiết lập tại thời điểm đó, hãy giải thích tình huống này.
Thiết lập trong lần sử dụng đầu tiên
Người dùng luôn có thể kích hoạt một VIA chưa được định cấu hình đúng cách. Trong những trường hợp như vậy:
- Thông báo cho người dùng bằng lời về tình huống này (ví dụ: "Để hoạt động đúng cách, tôi cần bạn hoàn tất một vài bước...").
- Nếu công cụ hạn chế trải nghiệm người dùng cho phép (xem UX_RESTRICTIONS_NO_SETUP), hãy hỏi người dùng xem họ có muốn bắt đầu quy trình thiết lập hay không, rồi mở màn hình Cài đặt cho VIA.
- Nếu không (ví dụ: nếu người dùng đang lái xe), hãy để lại một thông báo để người dùng nhấp vào lựa chọn này khi thấy an toàn.
Xây dựng màn hình thiết lập tương tác bằng giọng nói
Bạn nên phát triển màn hình thiết lập và đăng nhập dưới dạng các hoạt động thông thường. Hãy xem hướng dẫn về trải nghiệm người dùng và hình ảnh để phát triển giao diện người dùng trong phần Trợ lý được tải sẵn: Hướng dẫn về trải nghiệm người dùng.
Nguyên tắc chung:
- VIA phải cho phép người dùng tạm dừng và tiếp tục thiết lập bất cứ lúc nào.
- Không được phép thiết lập nếu quy định hạn chế
UX_RESTRICTIONS_NO_SETUPcó hiệu lực. Để biết thông tin chi tiết, hãy xem Nguyên tắc về việc gây mất tập trung cho người lái xe. - Màn hình thiết lập phải phù hợp với hệ thống thiết kế của từng loại xe. Bố cục màn hình chung, biểu tượng, màu sắc và các khía cạnh khác phải nhất quán với phần còn lại của giao diện người dùng. Hãy xem phần Tuỳ chỉnh để biết thông tin chi tiết.
Triển khai màn hình cài đặt

Hình 4. Tích hợp chế độ cài đặt
Màn hình cài đặt là các hoạt động thông thường trên Android. Nếu được triển khai, điểm truy cập của chúng phải được khai báo trong res/xml/interaction_service.xml trong tệp kê khai VIA (xem phần Tệp kê khai).
Phần Cài đặt là nơi phù hợp để tiếp tục thiết lập và đăng nhập (nếu người dùng chưa hoàn tất) hoặc cung cấp lựa chọn đăng xuất hoặc chuyển đổi người dùng nếu cần. Tương tự như các màn hình Thiết lập được mô tả ở trên, những màn hình này phải:
- Cung cấp lựa chọn thoát để quay lại màn hình trước trong ngăn xếp màn hình (ví dụ: để chuyển đến phần Cài đặt xe).
- Không được phép sử dụng khi đang lái xe. Để biết thông tin chi tiết, hãy xem Nguyên tắc về việc gây mất tập trung cho người lái xe.
- Ghép từng hệ thống thiết kế xe. Để biết thông tin chi tiết, hãy xem phần Tuỳ chỉnh.
Khai báo các quyền bắt buộc trong tệp kê khai
Các quyền mà VIA yêu cầu có thể được chia thành 3 danh mục:
- Quyền chữ ký hệ thống. Đây là những quyền chỉ được cấp cho các APK được ký hệ thống và cài đặt sẵn. Người dùng không thể cấp các quyền này, chỉ OEM mới có thể cấp các quyền đó khi tạo hình ảnh hệ thống. Để biết thêm thông tin về cách lấy quyền chữ ký, hãy xem phần Cấp quyền đặc quyền hệ thống.
- Các quyền nguy hiểm. Đây là những quyền mà người dùng phải cấp bằng cách sử dụng hộp thoại PermissionsController. OEM có thể cấp trước một số quyền này cho VoiceInteractionService mặc định. Tuy nhiên, vì chế độ mặc định này có thể thay đổi tuỳ theo từng thiết bị, nên các ứng dụng phải có thể yêu cầu những quyền này khi cần.
- Các quyền khác. Đây là tất cả các quyền khác không yêu cầu người dùng can thiệp. Hệ thống sẽ tự động cấp các quyền này.
Với những thông tin trên, phần sau đây chỉ tập trung vào việc yêu cầu các quyền nguy hiểm. Bạn chỉ nên yêu cầu quyền khi người dùng đang ở màn hình đăng nhập hoặc màn hình cài đặt.
Nếu ứng dụng không có các quyền cần thiết để hoạt động, thì quy trình được đề xuất là sử dụng một câu lệnh bằng giọng nói để giải thích tình huống cho người dùng và một thông báo để cung cấp một cơ chế mà người dùng có thể sử dụng để quay lại màn hình cài đặt VIA. Để biết thông tin chi tiết, hãy xem 1. Lời nhắc về thông báo.
Yêu cầu quyền trong màn hình cài đặt
Các quyền có mức độ bảo vệ nguy hiểm được yêu cầu bằng phương thức ActivityCompat#requestPermission() thông thường (hoặc phương thức tương đương). Để biết thông tin chi tiết về cách yêu cầu cấp quyền, hãy xem phần Yêu cầu quyền cho ứng dụng.

Hình 5. Yêu cầu cấp quyền
Quyền của trình nghe thông báo
Để triển khai quy trình TTR, VIA phải được chỉ định làm trình nghe thông báo. Đây không phải là một quyền riêng biệt, mà là một cấu hình cho phép hệ thống gửi thông báo đến các trình nghe đã đăng ký. Để biết liệu VIA có được cấp quyền truy cập vào thông tin này hay không, các ứng dụng có thể:
- (Không bắt buộc) Kiểm tra xem có trình nghe thông báo trước hay không bằng cách sử dụng
CarAssistUtils#assistantIsNotificationListener(). Ví dụ: bạn có thể thực hiện việc này trong quy trình thiết lập. - (Bắt buộc) Phản ứng với việc xử lý
CarVoiceInteractionSession#onShow()bằng thao tácVOICE_ACTION_HANDLE_EXCEPTIONvà ngoại lệEXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING.
Nếu quyền truy cập này chưa được cấp trước, thì VIA sẽ hướng người dùng đến phần Quyền truy cập vào thông báo trong phần Cài đặt ô tô, bằng cách sử dụng kết hợp các câu lệnh và thông báo. Bạn có thể dùng mã sau để mở phần thích hợp của ứng dụng cài đặt:
private void requestNotificationListenerAccess() {
Intent intent = new Intent(Settings
.ACTION_NOTIFICATION_LISTENER_SETTINGS);
intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
startActivity(intent);
}Triển khai giao diện người dùng bảng thoại
Khi nhận được lệnh gọi lại onShow(), VoiceInteractionSession có thể trình bày giao diện người dùng bảng thoại. Để biết các nguyên tắc về hình ảnh và trải nghiệm người dùng khi triển khai bảng điều khiển bằng giọng nói,hãy xem phần Trợ lý được tải sẵn: Hướng dẫn về trải nghiệm người dùng.

Hình 6. Hiển thị bảng nhận diện giọng nói
Có 2 lựa chọn về cách triển khai giao diện người dùng này:
- Ghi đè
VoiceInteractionSession#onCreateContentView() - Chạy một Hoạt động bằng cách dùng
VoiceInteractionSession#startAssistantActivity()
Sử dụng onCreateContentView()
Đây là cách mặc định để trình bày một bảng giọng nói. Lớp cơ sở VoiceInteractionSession tạo một cửa sổ và quản lý vòng đời của cửa sổ đó miễn là phiên thoại vẫn đang hoạt động. Các ứng dụng phải ghi đè VoiceInteractionSession#onCreateContentView() và trả về một khung hiển thị được đính kèm vào cửa sổ đó ngay khi phiên được tạo. Ban đầu, khung hiển thị này sẽ không xuất hiện. Khi một hoạt động tương tác bằng giọng nói bắt đầu, khung hiển thị này sẽ xuất hiện trên VoiceInteractionSession#onShow() rồi biến mất trên 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); } … }
Khi sử dụng phương thức này, bạn có thể muốn điều chỉnh VoiceInteractionSession#onComputeInsets() để tính đến các vùng bị che khuất trên giao diện người dùng.
Sử dụng startAssistantActivity()
Trong trường hợp này, VoiceInteractionSession uỷ quyền xử lý giao diện người dùng biển báo bằng giọng nói cho một hoạt động thông thường. Khi sử dụng lựa chọn này, quá trình triển khai VoiceInteractionSession phải tắt việc tạo cửa sổ nội dung mặc định (xem phần Sử dụng onCreateContentView()) trên lệnh gọi lại onPrepareShow(). Tại VoiceInteractionSession#onShow(), phiên sẽ bắt đầu hoạt động nhận dạng giọng nói bằng cách dùng VoiceInteractionSession#startAssistantActivity(). Phương thức này khởi tạo giao diện người dùng bằng các chế độ cài đặt cửa sổ và cờ hoạt động phù hợp.
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); } … }
Để duy trì hoạt động giao tiếp giữa hoạt động này và VoiceInteractionSession, bạn có thể cần một nhóm các Ý định nội bộ hoặc liên kết dịch vụ. Ví dụ: khi VoiceInteractionSession#onHide() được gọi, phiên phải có thể truyền yêu cầu này đến hoạt động.
Quan trọng. Trong Automotive, chỉ những hoạt động được chú thích đặc biệt hoặc những hoạt động có trong "danh sách cho phép" UXR mới có thể hiển thị trong khi lái xe. Điều này cũng áp dụng cho các hoạt động bắt đầu bằng VoiceInteractionSession#startAssistantActivity(). Hãy nhớ chú giải hoạt động của bạn bằng <meta-data
android:name="distractionOptimized" android:value="true"/> hoặc thêm hoạt động này vào khoá systemActivityWhitelist của tệp /packages/services/Car/service/res/values/config.xml. Để biết thêm thông tin, hãy xem Nguyên tắc về việc gây xao nhãng cho người lái xe.
Triển khai tính năng nhận dạng giọng nói
Trong phần này, bạn sẽ tìm hiểu cách triển khai tính năng nhận dạng giọng nói thông qua việc phát hiện và nhận dạng từ khoá kích hoạt. Từ khoá kích hoạt là một từ kích hoạt được dùng để bắt đầu một cụm từ tìm kiếm hoặc hành động mới bằng giọng nói. Ví dụ: "Ok Google" hoặc "Hey Google".
Tính năng phát hiện từ khoá kích hoạt DSP
Android cung cấp quyền truy cập vào một trình phát hiện cụm từ kích hoạt luôn bật ở cấp DSP bằng AlwaysOnHotwordDetector.
cách triển khai tính năng phát hiện từ khoá với mức sử dụng CPU thấp. Việc sử dụng chức năng này được chia thành hai phần:
- Tạo bản sao của
AlwaysOnHotwordDetector. - Đăng ký mô hình âm thanh phát hiện cụm từ kích hoạt.
Việc triển khai VoiceInteractionService có thể tạo một trình phát hiện từ khoá kích hoạt bằng cách sử dụng VoiceInteractionService#createAlwaysOnHotwordDetector(), truyền một cụm từ khoá và ngôn ngữ mà họ muốn sử dụng để phát hiện. Do đó, ứng dụng sẽ nhận được một lệnh gọi lại onAvailabilityChanged() với một trong các giá trị có thể có sau đây:
STATE_HARDWARE_UNAVAILABLE. Thiết bị không có khả năng DSP. Trong trường hợp này, tính năng phát hiện từ khoá bằng phần mềm sẽ được dùng.STATE_HARDWARE_UNSUPPORTED. DSP không được hỗ trợ nói chung, nhưng DSP không hỗ trợ tổ hợp cụm từ khoá và ngôn ngữ đã cho. Ứng dụng có thể chọn sử dụng tính năng Phát hiện cụm từ kích hoạt bằng phần mềm.STATE_HARDWARE_ENROLLED. Tính năng phát hiện từ khoá đã sẵn sàng và có thể bắt đầu bằng cách gọi phương thứcstartRecognition().STATE_HARDWARE_UNENROLLED. Không có mô hình âm thanh cho cụm từ khoá được yêu cầu, nhưng bạn có thể đăng ký.
Bạn có thể đăng ký các mô hình âm thanh phát hiện cụm từ kích hoạt bằng cách sử dụng IVoiceInteractionManagerService#updateKeyphraseSoundModel().
Bạn có thể đăng ký nhiều mô hình trong hệ thống tại một thời điểm nhất định, nhưng chỉ một mô hình được liên kết với một AlwaysOnHotwordDetector.
Tính năng phát hiện từ khoá nóng DSP có thể không dùng được trên một số thiết bị. Nhà phát triển VIA nên kiểm tra các chức năng phần cứng bằng phương thức getDspModuleProperties(). Để xem mã mẫu minh hoạ cách đăng ký các mô hình âm thanh, hãy xem VoiceEnrollment/src/com/android/test/voiceenrollment/EnrollmentUtil.java.
Xem phần Chụp đồng thời liên quan đến tính năng nhận dạng từ khoá kích hoạt đồng thời.
Phát hiện cụm từ kích hoạt bằng phần mềm
Như đã nêu ở trên, tính năng phát hiện từ khoá kích hoạt DSP có thể không có trên một số thiết bị (ví dụ: trình mô phỏng Android không cung cấp tính năng mô phỏng DSP). Trong trường hợp này, phần mềm nhận dạng giọng nói là lựa chọn thay thế duy nhất. Để tránh gây trở ngại cho các ứng dụng khác có thể cần quyền truy cập vào micrô, VIA phải truy cập vào đầu vào âm thanh bằng cách sử dụng:
- Tính năng ghi âm phải sử dụng MediaRecorder.AudioSource.HOTWORD.
- Giữ quyền
android.Manifest.permission.CAPTURE_AUDIO_HOTWORD.
Cả hai hằng số này đều là @hide và chỉ có sẵn cho các ứng dụng đi kèm.
Quản lý đầu vào âm thanh và tính năng nhận dạng giọng nói
Đầu vào âm thanh sẽ được triển khai bằng lớp MediaRecorder.
Để biết thêm thông tin về cách sử dụng API này, hãy xem phần Tổng quan về MediaRecorder. Các dịch vụ tương tác bằng giọng nói cũng dự kiến sẽ là các hoạt động triển khai lớp RecognitionService. Mọi ứng dụng trong hệ thống cần tính năng nhận dạng giọng nói đều sử dụng
để truy cập vào tính năng này. Để nhận dạng giọng nói và có quyền truy cập vào micrô, VIA phải có android.permission.RECORD_AUDIO.
Các ứng dụng truy cập vào một chế độ triển khai RecognitionService cũng phải có quyền này.
Trước Android 10, quyền truy cập vào micrô chỉ được cấp cho một ứng dụng tại một thời điểm (ngoại trừ tính năng phát hiện từ khoá kích hoạt, xem ở trên). Kể từ Android 10, bạn có thể chia sẻ quyền truy cập vào micrô. Để biết thêm thông tin, hãy xem bài viết Chia sẻ nguồn âm thanh đầu vào.
Truy cập vào đầu ra âm thanh
Khi VIA đã sẵn sàng đưa ra câu trả lời bằng lời nói, bạn cần tuân thủ bộ nguyên tắc tiếp theo sau đây:
- Khi yêu cầu cấp quyền phát âm thanh hoặc quản lý đầu ra âm thanh, ứng dụng phải sử dụng
AudioAttributes#USAGE_ASSISTANTvàAudioAttributes#CONTENT_TYPE_SPEECHlàm thuộc tính âm thanh. - Trong quá trình nhận dạng lời nói, bạn phải yêu cầu cấp quyền phát âm thanh bằng
AudioManage#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE. Xin lưu ý rằng một số ứng dụng đa phương tiện có thể không phản hồi đúng cách đối với các lệnh đa phương tiện (xem phần Đáp ứng các lệnh đa phương tiện) trong khi tiêu điểm âm thanh của chúng bị xoá.