建设购物网站的方案wordpress网站制作价格
2026/1/23 19:37:29 网站建设 项目流程
建设购物网站的方案,wordpress网站制作价格,创建网站的详细步骤,教育学校网站做鸿蒙学习实战之路-语音识别-离线转文本实现 最近好多朋友问我#xff1a;“西兰花啊#xff0c;我想做个鸿蒙应用#xff0c;需要离线语音转文字功能#xff0c;这玩意儿难不难啊#xff1f;” 害#xff0c;这问题可问对人了#xff01;作为一个正在把 npm install 炒…鸿蒙学习实战之路-语音识别-离线转文本实现最近好多朋友问我“西兰花啊我想做个鸿蒙应用需要离线语音转文字功能这玩意儿难不难啊” 害这问题可问对人了作为一个正在把npm install炒成ohpm install的前端厨子_我刚好用鸿蒙的 SpeechKit 实现过类似功能今天这篇我就手把手带你实现离线语音识别转文本全程不超过 10 分钟不含下载依赖时间功能概述简单来说这玩意儿就是把中文音频支持中文普通话及中文语境下的英文转换成文字支持 PCM 音频文件或实时语音输入。短语音模式不超过 60 秒长语音模式不超过 8 小时特别适合手机/平板等设备在无网状态下使用。场景介绍适用于听障人士辅助、会议记录、语音笔记等场景尤其是在地铁、山区等无网环境下依然能正常工作相当实用约束与限制约束项具体说明支持语种中文普通话模型类型离线语音时长短语音 ≤60 秒长语音 ≤8 小时音频格式PCM 格式16000Hz 采样率单声道16 位采样位深西兰花警告我有个朋友第一次做的时候随便用了个 MP3 格式的音频结果识别率为 0血泪教训啊朋友们必须严格按照要求的音频格式来开发步骤1. 导入依赖首先咱们得把需要的工具库导进来就像炒菜前先备菜一样import{speechRecognizer}fromkit.CoreSpeechKit;import{BusinessError}fromkit.BasicServicesKit;2. 初始化引擎接下来要创建语音识别引擎实例这就像是给咱们的语音识别系统装个发动机letasrEngine:speechRecognizer.SpeechRecognitionEngine;letsessionId:string123456;// 自定义会话ID随便起个就行// 配置引擎参数constinitParams:speechRecognizer.CreateEngineParams{language:zh-CN,// 支持的语种咱们就用中文online:1,// 0:离线模式, 1:在线模式(预留)这里虽然写1但实际是离线extraParams:{locate:CN,recognizerMode:short,// short/long根据需求选},};// 创建引擎speechRecognizer.createEngine(initParams,(err:BusinessError,engine:speechRecognizer.SpeechRecognitionEngine){if(!err){console.info(引擎初始化成功准备开工);asrEngineengine;// 设置回调监听setRecognitionListener();}else{// 错误码说明:// 1002200001: 语种不支持/模式不支持/初始化超时/资源不存在// 1002200006: 引擎忙碌中(多应用同时调用)// 1002200008: 引擎已被销毁console.error(引擎初始化失败:${err.code}-${err.message});}});3. 设置识别回调现在咱们得给引擎装个耳朵让它能把听到的内容反馈给咱们functionsetRecognitionListener(){constlistener:speechRecognizer.RecognitionListener{// 开始识别成功回调onStart(sessionId:string,eventMessage:string){console.info(开始识别: sessionId${sessionId}, message${eventMessage});},// 事件回调onEvent(sessionId:string,eventCode:number,eventMessage:string){console.info(事件通知: sessionId${sessionId}, code${eventCode}, message${eventMessage});},// 识别结果回调(包含中间结果和最终结果)onResult(sessionId:string,result:speechRecognizer.SpeechRecognitionResult){console.info(识别结果:${JSON.stringify(result)});// 结果格式: {result: 识别文本, isFinal: true/false}},// 识别完成回调onComplete(sessionId:string,eventMessage:string){console.info(识别完成:${eventMessage});},// 错误回调onError(sessionId:string,errorCode:number,errorMessage:string){console.error(识别错误:${errorCode}-${errorMessage});// 1002200002: 重复调用startListening},};asrEngine.setListener(listener);}4. 配置识别参数并启动接下来咱们要给引擎设置一些具体参数比如音频格式、采样率之类的就像给汽车调校参数一样// 音频配置constaudioConfig:speechRecognizer.AudioInfo{audioType:pcm,// 音频类型必须是PCMsampleRate:16000,// 采样率(Hz)必须是16000soundChannel:1,// 声道数(1:单声道)sampleBit:16,// 采样位深必须是16};// 识别参数constrecognizerParams:speechRecognizer.StartParams{sessionId:sessionId,audioInfo:audioConfig,extraParams:{recognitionMode:0,// 0:连续识别, 1:一句话识别vadBegin:2000,// 开始静音检测时长(ms)vadEnd:3000,// 结束静音检测时长(ms)maxAudioDuration:20000,// 最大音频时长(ms)},};// 启动识别asrEngine.startListening(recognizerParams);西兰花小贴士这里的音频参数一定要严格按照约束与限制里的要求设置不然识别结果会惨不忍睹哦5. 写入音频流现在咱们需要把音频数据喂给引擎就像给发动机加油一样// 从文件读取或麦克风获取PCM音频流functionwriteAudioStream(audioData:Uint8Array){// 音频流长度需为640或1280字节这点很重要asrEngine.writeAudio(sessionId,audioData);}6. 资源释放最后咱们用完引擎后一定要记得释放资源就像用完厨房要打扫卫生一样// 结束识别asrEngine.finish(sessionId);// 取消识别asrEngine.cancel(sessionId);// 释放引擎资源asrEngine.shutdown();7. 权限配置别忘记在module.json5中添加麦克风权限不然应用会直接崩溃哦{module:{requestPermissions:[{name:ohos.permission.MICROPHONE,reason:需要麦克风权限进行语音识别,usedScene:{abilities:[EntryAbility],when:inuse}}]}}开发实例说了这么多咱们直接上完整的示例代码吧我给大家准备了一个简单的页面包含录音识别和文件识别两种功能完整页面实现Index.etsimport{speechRecognizer}fromkit.CoreSpeechKit;import{BusinessError}fromkit.BasicServicesKit;import{fileIo}fromkit.CoreFileKit;import{PromptAction}fromkit.ArkUI;constTAGSpeechRecognitionDemo;letasrEngine:speechRecognizer.SpeechRecognitionEngine;Entry Component struct SpeechRecognitionPage{State resultText:string识别结果将显示在这里;State isRecording:booleanfalse;privatesessionId:stringDate.now().toString();// 用时间戳当会话ID避免重复privatefileCapturer:FileCapturernewFileCapturer();build(){Column(){Text(语音识别演示).fontSize(24).fontWeight(FontWeight.Bold).margin(20).fontColor(#333);Text(this.resultText).width(90%).height(200).borderWidth(1).borderRadius(5).padding(10).margin(10).textAlign(TextAlign.Start).backgroundColor(#f5f5f5);Row(){Button(this.isRecording?停止识别:开始录音识别).onClick(()this.toggleRecording()).type(ButtonType.Capsule).backgroundColor(this.isRecording?#ff4d4f:#007dff).width(150).height(40).margin(10);Button(文件识别).onClick(()this.startFileRecognition()).type(ButtonType.Capsule).backgroundColor(#007dff).width(150).height(40).margin(10);}}.width(100%).height(100%).justifyContent(FlexAlign.Center);}// 初始化引擎用Promise封装更方便使用privateinitEngine(){returnnewPromisevoid((resolve,reject){if(asrEngine){resolve();return;}constinitParams:speechRecognizer.CreateEngineParams{language:zh-CN,online:1,extraParams:{locate:CN,recognizerMode:short}};speechRecognizer.createEngine(initParams,(err:BusinessError,engine:speechRecognizer.SpeechRecognitionEngine){if(!err){asrEngineengine;this.setListener();resolve();}else{this.resultText引擎初始化失败:${err.message};reject(err);}});});}// 设置识别回调privatesetListener(){constlistener:speechRecognizer.RecognitionListener{onResult:(sessionId:string,result:speechRecognizer.SpeechRecognitionResult){this.resultTextresult.result;},onError:(sessionId:string,errorCode:number,errorMessage:string){this.resultText识别错误:${errorCode}-${errorMessage};this.isRecordingfalse;},onComplete:(){this.isRecordingfalse;PromptAction.showToast({message:识别完成});}};asrEngine.setListener(listener);}// 开始/停止录音识别privateasynctoggleRecording(){if(this.isRecording){// 停止识别asrEngine.finish(this.sessionId);this.isRecordingfalse;}else{// 开始识别try{awaitthis.initEngine();constaudioParam:speechRecognizer.AudioInfo{audioType:pcm,sampleRate:16000,soundChannel:1,sampleBit:16};asrEngine.startListening({sessionId:this.sessionId,audioInfo:audioParam});this.isRecordingtrue;this.resultText正在识别...;}catch(err){this.resultText启动识别失败:${(errasBusinessError).message};}}}// 文件识别privateasyncstartFileRecognition(){try{awaitthis.initEngine();this.resultText正在读取文件并识别...;// 配置音频参数constaudioParam:speechRecognizer.AudioInfo{audioType:pcm,sampleRate:16000,soundChannel:1,sampleBit:16};// 启动识别asrEngine.startListening({sessionId:this.sessionId,audioInfo:audioParam});// 读取并写入音频文件constcontextthis.getUIContext().getHostContext()asContext;constfilePathcontext.resourceDir/test.pcm;// 资源目录下的PCM文件awaitthis.fileCapturer.startRead(filePath,(data:Uint8Array){asrEngine.writeAudio(this.sessionId,data);});}catch(err){this.resultText文件识别失败:${(errasBusinessError).message};}}}文件读取工具类FileCapturer.ets为了方便大家使用我还写了个文件读取工具类专门用来读取 PCM 音频文件import{fileIo}fromkit.CoreFileKit;constSEND_SIZE:number1280;// 每次发送的音频数据大小必须是640或1280exportdefaultclassFileCapturer{privatemIsReading:booleanfalse;privatemFile:fileIo.File|nullnull;// 读取PCM文件并通过回调返回数据asyncstartRead(filePath:string,callback:(data:Uint8Array)void):Promisevoid{returnnewPromise((resolve,reject){try{this.mIsReadingtrue;this.mFilefileIo.openSync(filePath,fileIo.OpenMode.READ_ONLY);constreadLoopasync(){if(!this.mIsReading)returnresolve();constbuffernewArrayBuffer(SEND_SIZE);constbytesReadfileIo.readSync(this.mFile!.fd,buffer,{offset:0,});if(bytesRead0){callback(newUint8Array(buffer.slice(0,bytesRead)));awaitnewPromise((resolve)setTimeout(resolve,40));// 模拟实时音频流readLoop();}else{fileIo.closeSync(this.mFile!);resolve();}};readLoop();}catch(e){reject(e);}});}// 停止读取stop(){this.mIsReadingfalse;if(this.mFile){fileIo.closeSync(this.mFile);}}}西兰花警告示例中的test.pcm文件需要你自己准备哦记得放在资源目录下并且格式要符合要求错误码参考为了避免大家遇到问题时手忙脚乱我整理了一些常见的错误码和解决方案错误码说明解决方案1002200001引擎初始化失败检查语种设置/确保模型文件存在1002200002重复调用 startListening确保前一次识别已完成1002200006引擎忙碌中等待其他应用释放引擎资源1002200008引擎已被销毁重新初始化引擎下一步行动学会了离线语音识别是不是感觉自己又掌握了一项新技能接下来你可以尝试把这个功能集成到你的鸿蒙应用中结合文本翻译功能实现多语言语音翻译优化识别结果的显示效果比如添加实时字幕推荐资源 推荐资料Core Speech Kit 概述API 参考文档错误码完整列表我是盐焗西兰花不教理论只给你能跑的代码和避坑指南。下期见

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询