HarmonyOS TEXT 语音搜索场景学习和总结

在HarmonyOS中实现语音搜索功能时,涉及到麦克风权限的申请、音频数据的采集、编码和传输等多个步骤。以下是对上述代码的详细解析和补充说明:

1. 麦克风权限的申请与检查

在HarmonyOS中,使用麦克风需要申请ohos.permission.MICROPHONE权限。在代码中,通过GRPermissionsUtils.checkPermissions方法来检查和申请权限。如果权限被授予,则可以继续进行音频采集操作。

typescript

复制

javascript 复制代码
GRPermissionsUtils.checkPermissions(permission).then((grantStatus: abilityAccessCtrl.GrantStatus) => {
    GRLog.info(this.TAG, 'startRecord checkPermissions then: ${grantStatus}');
    if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
        // 权限已授予,继续音频采集操作
    }
}).catch((error: BusinessError) => {
    // 处理权限申请失败的情况
});

2. 音频采集配置

在权限授予后,需要配置音频采集的参数,包括采样率、声道数、采样格式等。这些参数决定了音频数据的质量和格式。

typescript

复制

yaml 复制代码
let audioStreamInfo: audio.AudioStreamInfo = {
    samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000, // 采样率16kHz
    channels: audio.AudioChannel.CHANNEL_1, // 单声道
    sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 16位采样格式
    encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 原始编码类型
};

let audioCaptureInfo: audio.AudioCapturerInfo = {
    source: audio.SourceType.SOURCE_TYPE_MIC, // 音频源为麦克风
    capturerFlags: 0
};

let audioCaptureOptions: audio.AudioCapturerOptions = {
    streamInfo: audioStreamInfo,
    capturerInfo: audioCaptureInfo
};

3. 创建音频采集器并开始采集

通过audio.createAudioCapturer方法创建音频采集器,并开始采集音频数据。采集到的音频数据会通过回调函数audioCaptureStartReceiver进行处理。

typescript

复制

kotlin 复制代码
audio.createAudioCapturer(audioCaptureOptions, (error: BusinessError, capture: audio.AudioCapturer) => {
    if (error) {
        GRLog.info(this.TAG, 'startRecord createAudioCapturer error: ${JSON.stringify(error)}');
        // 处理麦克风权限被拒绝或采集器创建失败的情况
    } else {
        this.audioRecord = capture;
        this.audioRecord.off('readData', this.audioCaptureStartReceiver);
        this.audioRecord.on('readData', this.audioCaptureStartReceiver);
        this.audioRecord.start();
        this.mStartTime = systemDateTime.getTime(false);
    }
});

4. 音频数据处理

audioCaptureStartReceiver回调函数中,处理采集到的音频数据。每0.1秒发送一个数据包,并将音频数据进行Base64编码后发送到服务端进行解码和敏感词检测。

typescript

复制

kotlin 复制代码
private audioCaptureStartReceiver = (result: ArrayBuffer) => {
    GRLog.info(this.TAG, 'audioCaptureStartReceiver result:${result.byteLength}');
    try {
        // 计算录音时长
        let durationTime = systemDateTime.getTime(false) - this.mStartTime;
        if (durationTime > this.mMaxRecordTime) {
            this.isRecordTimeOut = true;
            // 提示用户录音时间过长
            return;
        }

        // 将音频数据添加到缓冲区
        this.tmpRecordBuffers.push(buffer.from(result.slice(0, result.byteLength)));
        this.tmpBufsize += result.byteLength;

        // 当缓冲区达到一定大小或录音结束时,发送数据
        if (this.tmpBufsize >= this.recordBufsize || 
            (this.isStopRecord && this.tmpBufsize > 0 && this.tmpBufsize < this.recordBufsize && this.tmpRecordBuffers.length > 0)) {
            let tmpResult = buffer.concat(this.tmpRecordBuffers).buffer;
            let read: number = tmpResult.byteLength;
            // 将音频数据添加到发送队列
            this.addAudio(tmpResult, read);
            this.tmpRecordBuffers = [];
            this.tmpBufsize = 0;
        }
    } catch (e) {
        // 处理异常
    }
}

5. PCM文件每帧容量的计算

PCM文件的每帧容量(单位:字节数)可以通过以下公式计算:

复制

复制代码
采样频率 * 采样位数 * 声道数 * 时间 / 8

例如,采样频率为16kHz,采样位数为16位,声道数为1,时间为0.1秒时,每帧容量为:

复制

ini 复制代码
16000 * 16 * 1 * 0.1 / 8 = 3200字节

6. 音频数据的Base64编码与传输

在发送音频数据之前,通常会将音频数据进行Base64编码,以确保数据在传输过程中不会丢失或损坏。编码后的数据可以通过HTTP请求发送到服务端进行解码和进一步处理。

7. 敏感词检测

服务端在接收到音频数据后,会进行解码并检测是否存在敏感词。如果检测到敏感词,服务端可以返回相应的提示信息,客户端可以根据返回结果进行相应的处理。

8. 补充与优化

  • 错误处理:在实际应用中,需要增加更多的错误处理逻辑,例如网络请求失败、服务端解码失败等情况。
  • 性能优化:对于长时间录音的场景,可以考虑对音频数据进行压缩,以减少数据传输量。
  • 用户体验:可以在录音过程中增加实时反馈,例如显示录音时长、音量大小等,提升用户体验。

总结

HarmonyOS提供了丰富的API来支持语音搜索功能的开发。通过合理的权限管理、音频采集配置、数据处理和传输,可以实现高效、稳定的语音搜索功能。后续可以根据实际需求进一步优化和扩展功能。

相关推荐
season_zhu39 分钟前
Swift:优雅又强大的语法糖——Then库
ios·架构·swift
hstar95272 小时前
二、即时通讯系统设计经验
java·架构
江梦寻2 小时前
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
开发语言·后端·python·macos·架构·策略模式
打码人的日常分享10 小时前
物联网智慧医院建设方案(PPT)
大数据·物联网·架构·流程图·智慧城市·制造
白水baishui11 小时前
搭建强化推荐的决策服务架构
架构·推荐系统·强化学习·决策服务·服务架构
何双新11 小时前
第23讲、Odoo18 邮件系统整体架构
ai·架构
雪碧聊技术11 小时前
将单体架构项目拆分成微服务时的两种工程结构
微服务·架构·module·project·工程结构
从零开始学习人工智能11 小时前
Doris 数据库深度解析:架构、原理与实战应用
数据库·架构
程序员JerrySUN12 小时前
[特殊字符] 深入理解 Linux 内核进程管理:架构、核心函数与调度机制
java·linux·架构
Theodore_102213 小时前
大数据(2) 大数据处理架构Hadoop
大数据·服务器·hadoop·分布式·ubuntu·架构