HarmonyOS Next 聊天页面底部输入组件开发(二)

124 阅读1分钟
3. 权限申请与语音识别引擎创建

使用 abilityAccessCtrl 申请录音权限,使用 speechRecognizer 创建语音识别引擎并设置监听回调。

async getPermission (context: Context): Promise<boolean> {
  let atManager = abilityAccessCtrl.createAtManager();
  return new Promise((resolve, reject) => {
    atManager.requestPermissionsFromUser( context, ['ohos.permission.MICROPHONE'] )
      .then((data) => {
        data.authResults.forEach(item => {
          if (item === 0) {
            console.log(`获取录音权限成功`)
            resolve(true)
          } else {
            console.error(`获取录音权限失败`)
            reject(false)
          }
        })
      })
  })
}

async createSREngine () {
  const extraParams: Record<string, Object> = {
    "locate": "CN", "recognizerMode": "short"
  }
  const initParamsInfo: speechRecognizer.CreateEngineParams = {
    language: 'zh-CN',
    online: 1, extraParams
  }
  try {
    this.asrEngine = await speechRecognizer.createEngine(initParamsInfo)
    console.log(TAG, `语音转文字引擎创建成功`)
    this.setListener()
  } catch (e) {
    console.error(TAG, `语音转文字引擎创建失败 ${e.code} ${e.message}`)
  }
}

setListener () {
  let setListener: speechRecognizer.RecognitionListener = {
    onStart: (sessionId: string, eventMessage: string) => {
      console.info(TAG, "onStart sessionId: " + sessionId + " eventMessage: " + eventMessage);
    },
    onEvent: (sessionId: string, eventCode: number, eventMessage: string) => {
      console.info(TAG, "onEvent sessionId: " + sessionId + " eventCode: " + eventCode + "eventMessage: " + eventMessage);
    },
    onResult: (sessionId: string, result: speechRecognizer.SpeechRecognitionResult) => {
      console.info(TAG, "onResult sessionId: " + sessionId + " result: " + JSON.stringify(result));
      if (result.result) {
        this.voiceText = result.result
      }
      if (result.isLast) {
        setTimeout(() => { this.show = false }, 1000)
      }
    },
    onComplete: (sessionId: string, eventMessage: string) => {
      console.info(TAG, "onComplete sessionId: " + sessionId + " eventMessage: " + eventMessage);
    },
    onError: (sessionId: string, errorCode: number, errorMessage: string) => {
      console.error(TAG, "onError sessionId: " + sessionId + " errorCode: " + errorCode + " errorMessage: " + errorMessage);
    }
  }
  try {
    this.asrEngine?.setListener(setListener);
    console.log(TAG, `已设置监听回调`)
  } catch (e) {
    console.error(TAG, `设置监听回调失败`)
  }
}

总结

通过上述代码实现,我们在 HarmonyOS Next 中完成了一个聊天页面底部输入组件的开发。该组件支持文字输入、语音输入切换和添加功能触发,同时具备语音识别功能。开发者可以根据实际需求对代码进行扩展和优化,以满足不同应用场景的需求。