Xây dựng component nhận diện giọng nói offline trên HarmonyOS NEXT

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;
});

Thẻ: HarmonyOS Next speechRecognizer typescript offline ASR permission management

Đăng vào ngày 12 tháng 9 lúc 03:43