HarmonyOS NEXT cung cấp mô hình nhận diện giọng nói ngoại tuyến speechRecognizer, hiện chỉ hỗ trợ tiếng Trung, cho kết quả khá chính xác.
Cấp quyền micro
Đầu tiên khai báo quyền trong file module.json5:
"reqPermissions": [
{ "name": "ohos.permission.MICROPHONE" }
]
Tiện ích kiểm tra và xin quyền:
import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';
export class AuthUtil {
static isGranted(perms: Permissions[]): boolean {
const mgr = abilityAccessCtrl.createAtManager();
const token = bundleManager
.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
.appInfo.accessTokenId;
return perms.length > 0 && perms.every(p =>
abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED ===
mgr.checkAccessTokenSync(token, p)
);
}
static async request(perms: Permissions[]): Promise<boolean> {
const mgr = abilityAccessCtrl.createAtManager();
const ctx = getContext() as common.UIAbilityContext;
const res = await mgr.requestPermissionsFromUser(ctx, perms);
return res.authResults.every(r => r === 0);
}
}
Quản lý engine nhận diện
import { speechRecognizer } from '@kit.CoreSpeechKit';
class VoiceEngine {
private static engine: speechRecognizer.SpeechRecognitionEngine | null = null;
private static sid = 'sid' + Date.now();
private static cfg: speechRecognizer.CreateEngineParams = {
language: 'zh-CN',
online: 1, // offline
extraParams: { locate: 'CN', recognizerMode: 'long' }
};
private static async build() {
VoiceEngine.engine = await speechRecognizer.createEngine(VoiceEngine.cfg);
}
private static setCb(cb: (r: speechRecognizer.SpeechRecognitionResult) => void) {
const listener: speechRecognizer.RecognitionListener = {
onStart(id, msg) { console.info('start', id); },
onEvent(id, code, msg) {},
onResult(id, result) { cb(result); },
onComplete(id, msg) { console.info('complete'); },
onError(id, code, msg) { console.error('err', code, msg); }
};
VoiceEngine.engine?.setListener(listener);
}
static async launch(onText: (r: speechRecognizer.SpeechRecognitionResult) => void) {
if (!VoiceEngine.engine) await VoiceEngine.build();
VoiceEngine.setCb(onText);
const params: speechRecognizer.StartParams = {
sessionId: VoiceEngine.sid,
audioInfo: {
audioType: 'pcm',
sampleRate: 16000,
soundChannel: 1,
sampleBit: 16
},
extraParams: {
recognitionMode: 0, // real-time
maxAudioDuration: 60000
}
};
VoiceEngine.engine?.startListening(params);
}
static stop() {
VoiceEngine.engine?.cancel(VoiceEngine.sid);
VoiceEngine.engine?.shutdown();
}
}
export default VoiceEngine;
Sử dụng trong UI
const micPerm: Permissions[] = ['ohos.permission.MICROPHONE'];
const granted = await AuthUtil.isGranted(micPerm);
if (!granted) await AuthUtil.request(micPerm);
VoiceEngine.launch(res => {
console.info('voice result', JSON.stringify(res));
this.displayText = res.result;
});