实时语音交互,打造更加智能便捷的应用

news/2024/9/30 15:51:40

随着人工智能和自然语言处理技术的进步,用户对智能化和便捷化应用的需求不断增加。语音交互技术以其直观的语音指令,革新了传统的手动输入方式,简化了用户操作,让应用变得更加易用和高效。

通过语音交互,用户可以在不方便使用触屏操作例如驾驶、烹饪时通过语音指令进行操作;在需要输入大量文本时,通过语音输入,可以显著提高信息输入的效率;此外,语音交互也为视觉障碍或阅读困难的用户提供了一种便捷的替代交互方式。

HarmonyOS SDK 基础语音服务(Core Speech Kit)集成了语音类基础AI能力,包括文本转语音(TextToSpeech)及语音识别(SpeechRecognizer)能力,便于用户与设备进行互动,实现将实时输入的语音与文本之间相互转换。

文本转语音

可高效的将一段不超过10000字符的文本合成为可播报的音频流,将文字转换成流畅自然的人声,广泛适用于有声阅读、新闻播报、站厅播报等多个应用场景。

系统无障碍接入文本转语音能力,在无网状态下,也可以为视障人士提供普通话播报功能,音色为聆小珊女声。

image

语音识别

可高效实现将实时语音转写成文字,解放双手,适用于语音聊天、语音搜索、语音指令、语音问答等多个应用场景。

将一段音频(时长不超过60s)信息转换为文本。语音识别服务提供将音频信息转换为文本的能力,便于用户与设备进行互动,实现实时语音交互、语音识别。目前本服务支持的语种为中文,支持离线模型。

image

能力优势

稳定可靠:端侧能力,不依赖网络,稳定可靠。

即开即用:系统原生API,不占用应用空间,开箱即用。

功能丰富:针对不同场景,提供了丰富的扩展和调节参数。

功能演示

image
image

开发步骤

(一) 文本转语音

1.在使用文本转语音时,将实现文本转语音相关的类添加至工程。

import { textToSpeech } from '@kit.CoreSpeechKit';
import { BusinessError } from '@kit.BasicServicesKit';

2.调用createEngine接口,创建textToSpeechEngine实例。

createEngine接口提供了两种调用形式,当前以其中一种作为示例,其他方式可参考API参考。

let ttsEngine: textToSpeech.TextToSpeechEngine;// 设置创建引擎参数
let extraParam: Record<string, Object> = {"style": 'interaction-broadcast', "locate": 'CN', "name": 'EngineName'};
let initParamsInfo: textToSpeech.CreateEngineParams = {language: 'zh-CN',person: 0,online: 1,extraParams: extraParam
};// 调用createEngine方法
textToSpeech.createEngine(initParamsInfo, (err: BusinessError, textToSpeechEngine: textToSpeech.TextToSpeechEngine) => {if (!err) {console.info('Succeeded in creating engine');// 接收创建引擎的实例ttsEngine = textToSpeechEngine;} else {// 创建引擎失败时返回错误码1003400005,可能原因:引擎不存在、资源不存在、创建引擎超时console.error(`Failed to create engine. Code: ${err.code}, message: ${err.message}.`);}
});

3.得到TextToSpeechEngine实例对象后,实例化SpeakParams对象、SpeakListener对象,并传入待合成及播报的文本originalText,调用speak接口进行播报。

// 设置speak的回调信息
let speakListener: textToSpeech.SpeakListener = {// 开始播报回调onStart(requestId: string, response: textToSpeech.StartResponse) {console.info(`onStart, requestId: ${requestId} response: ${JSON.stringify(response)}`);},// 合成完成及播报完成回调onComplete(requestId: string, response: textToSpeech.CompleteResponse) {console.info(`onComplete, requestId: ${requestId} response: ${JSON.stringify(response)}`);},// 停止播报回调onStop(requestId: string, response: textToSpeech.StopResponse) {console.info(`onStop, requestId: ${requestId} response: ${JSON.stringify(response)}`);},// 返回音频流onData(requestId: string, audio: ArrayBuffer, response: textToSpeech.SynthesisResponse) {console.info(`onData, requestId: ${requestId} sequence: ${JSON.stringify(response)} audio: ${JSON.stringify(audio)}`);},// 错误回调onError(requestId: string, errorCode: number, errorMessage: string) {console.error(`onError, requestId: ${requestId} errorCode: ${errorCode} errorMessage: ${errorMessage}`);}
};
// 设置回调
ttsEngine.setListener(speakListener);
let originalText: string = '你好,华为';
// 设置播报相关参数
let extraParam: Record<string, Object> = {"queueMode": 0, "speed": 1, "volume": 2, "pitch": 1, "languageContext": 'zh-CN',  
"audioType": "pcm", "soundChannel": 3, "playType": 1 };
let speakParams: textToSpeech.SpeakParams = {requestId: '123456', // requestId在同一实例内仅能用一次,请勿重复设置extraParams: extraParam
};
// 调用播报方法
ttsEngine.speak(originalText, speakParams);

(二) 语音识别

1.在使用语音识别时,将实现语音识别相关的类添加至工程。

import { speechRecognizer } from '@kit.CoreSpeechKit';
import { BusinessError } from '@kit.BasicServicesKit';

2.调用createEngine方法,对引擎进行初始化,并创建SpeechRecognitionEngine实例。

createEngine方法提供了两种调用形式,当前以其中一种作为示例,其他方式可参考API参考。

let asrEngine: speechRecognizer.SpeechRecognitionEngine;
let requestId: string = '123456';
// 创建引擎,通过callback形式返回
// 设置创建引擎参数
let extraParam: Record<string, Object> = {"locate": "CN", "recognizerMode": "short"};
let initParamsInfo: speechRecognizer.CreateEngineParams = {language: 'zh-CN',online: 1,extraParams: extraParam
};
// 调用createEngine方法
speechRecognizer.createEngine(initParamsInfo, (err: BusinessError, speechRecognitionEngine: speechRecognizer.SpeechRecognitionEngine) => {if (!err) {console.info('Succeeded in creating engine.');// 接收创建引擎的实例asrEngine = speechRecognitionEngine;} else {// 无法创建引擎时返回错误码1002200008,原因:引擎正在销毁中console.error(`Failed to create engine. Code: ${err.code}, message: ${err.message}.`);}
});

3.得到SpeechRecognitionEngine实例对象后,实例化RecognitionListener对象,调用setListener方法设置回调,用来接收语音识别相关的回调信息。

// 创建回调对象
let setListener: speechRecognizer.RecognitionListener = {// 开始识别成功回调onStart(sessionId: string, eventMessage: string) {console.info(`onStart, sessionId: ${sessionId} eventMessage: ${eventMessage}`);},// 事件回调onEvent(sessionId: string, eventCode: number, eventMessage: string) {console.info(`onEvent, sessionId: ${sessionId} eventCode: ${eventCode} eventMessage: ${eventMessage}`);},// 识别结果回调,包括中间结果和最终结果onResult(sessionId: string, result: speechRecognizer.SpeechRecognitionResult) {console.info(`onResult, sessionId: ${sessionId} sessionId: ${JSON.stringify(result)}`);},// 识别完成回调onComplete(sessionId: string, eventMessage: string) {console.info(`onComplete, sessionId: ${sessionId} eventMessage: ${eventMessage}`);},// 错误回调,错误码通过本方法返回// 如:返回错误码1002200006,识别引擎正忙,引擎正在识别中// 更多错误码请参考错误码参考onError(sessionId: string, errorCode: number, errorMessage: string) {console.error(`onError, sessionId: ${sessionId} errorCode: ${errorCode} errorMessage: ${errorMessage}`);}
}
// 设置回调
asrEngine.setListener(setListener);

4.设置开始识别的相关参数,调用startListening方法,开始合成。

let audioParam: speechRecognizer.AudioInfo = {audioType: 'pcm', sampleRate: 16000, soundChannel: 1, sampleBit: 16};
let extraParam: Record<string, Object> = {"vadBegin": 2000, "vadEnd": 3000, "maxAudioDuration": 40000};
let recognizerParams: speechRecognizer.StartParams = {sessionId: requestId,audioInfo: audioParam,extraParams: extraParam
};
// 调用开始识别方法
asrEngine.startListening(recognizerParams);

5.传入音频流,调用writeAudio方法,开始写入音频流。读取音频文件时,开发者需预先准备一个pcm格式音频文件。

let uint8Array: Uint8Array = new Uint8Array();
// 可以通过如下方式获取音频流:1、通过录音获取音频流;2、从音频文件中读取音频流
// 写入音频流,音频流长度仅支持640或1280
asrEngine.writeAudio(requestId, uint8Array);

了解更多详情>>

访问基础语音服务联盟官网

获取文本转语音服务开发指导文档

获取语音识别服务开发指导文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66532.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

基于大模型搭建运力业务的“小红书”

作者:京东物流 朱飞 一、背景问题 1、职能人员(运营管理人员)日常工作所涉及的知识信息包括业务最新SOP、发文、操作手册等,获取渠道较分散,很多都依靠线下传递(发邮件、咚咚分享等),目前运力业务各种Sop、操作手册等文档上千个,累计文字过百万,缺乏统一查询入口,需…

能力有限公司

曹明杰 202201170101 性格:外向、乐观、善于团队合作。他总是能够迅速适应新环境,并且有很强的领导能力。 擅长的技术:打游戏 兴趣爱好:阅读小说、旅行探索新地方。 项目角色:项目负责人、爬虫工程师 一句话宣言:乐观的编程领袖,以Python和云计算技术引领创新,热爱科幻…

Java的日期类都是怎么用的

Java中的Date 为什么用类表示日期,而不是像其他语言中那样用一个内置(built-in)类型来表示?例如,Visual Basic 中有一个内置的 date 类型,程序员可以采用#12/31/1999格式指定日期。看起来这似乎很方便,程序员只需要使用内置的 date 类型而不用考虑类。但实际上,VisualBas…

P7730 [JDWOI-1] 蜀道难

首先,区间增加定值并且要求单调不降,很容易想到差分。 于是先把 \(h\) 数组差分一下,题目的要求即为最小代价使得 \(h\) 均为非负数。 观察一下两种操作,发现 \(n\) 的范围很小,可以枚举操作的起点 \(i\) ,然后如果操作是压低,相当于 \(h[i]--,h[i+l[i]]++\) 。而如果操…

就叫它new Star2024 的WP好了

begin WP 跟着引导走就好,这个引导做的还不错,能教人怎么用IDAbase64 WP总算知道为啥面试会问我是不是不知道base64编码,原来这个就是啊,和北邮新生赛re签到题基本一样。 看懂逻辑,经典3并4后单表替换,然后写代码解决就好

洛谷题单指南-分治与倍增-P6648 [CCC2019] Triangle: The Data Structure

原题链接:https://www.luogu.com.cn/problem/P6648 题意解读:在一个n行的数字三角形中,求所有边长为k的正三角形最大值之和。 解题思路: 1、枚举法 枚举每一个边长为k的三角形,在其中求max,然后累加,n最多3000,时间复杂度是n^4,显然超时。 2、倍增和ST思想 此题非常类…

确保上传的缩略图在 PbootCMS 中保持清晰

config/config.php 文件中的相关部分:// 缩略图配置 ico => array(max_width => 1920, // 最大宽度1920max_height => // 最大高度不填写代表不限制 ),清除缓存清除系统缓存修改完配置文件后,需要清除系统缓存,确保配置更新生效。 在后台管理中找到“缓存管…