HarmonyOS NEXT 应用开发练习:AI智能语音播报

devtools/2025/1/8 3:25:37/

一、DEMO思路

在这个HarmonyOS NEXT原生应用DEMO中,我们将使用ArkTS开发语言创建一个简单的AI智能语音播报应用。

该应用能够接收用户输入的文本,并使用TTS(Text-To-Speech,文本转语音)技术将文本转换为语音进行播报。

当然除了基本的文本输入和播报功能外,我们还增加了语音识别的功能,允许用户通过语音输入要播报的文本。

还优化了用户界面,增加了更多的交互元素和视觉反馈。

二、实现代码

import { TextInput, Button, Toast, Flex, Image } from '@ohos.arkui';
import tts from '@ohos.multimedia.tts';
import asr from '@ohos.multimedia.asr'; // 引入语音识别模块@Entry
@Component
struct AISpeechDemo {@State userInput: string = '';@State isListening: boolean = false;// 语音识别成功回调onRecognitionSuccess = (result: string) => {this.userInput = result;Toast.show('语音识别成功');this.stopListening(); // 停止监听};// 语音识别失败回调onRecognitionError = (error: any) => {Toast.show(`语音识别失败: ${error.message}`);this.stopListening(); // 停止监听};// 开始语音识别startListening = () => {if (!this.isListening) {asr.startRecognition({language: 'zh-CN',onVolumeChanged: (volume: number) => {// 可以在这里添加音量变化的视觉反馈},onResult: (result: any) => {this.onRecognitionSuccess(result.text);},onError: (error: any) => {this.onRecognitionError(error);},onStateChanged: (state: string) => {if (state === 'LISTENING') {this.isListening = true;} else if (state === 'IDLE') {this.isListening = false;}}});}};// 停止语音识别stopListening = () => {if (this.isListening) {asr.stopRecognition();this.isListening = false;}};// 播报文本speakText = () => {if (this.userInput.trim() !== '') {tts.speak({text: this.userInput,language: 'zh-CN',pitch: 1.0,rate: 1.0,volume: 1.0,onSuccess: () => {Toast.show('播报成功');},onError: (error) => {Toast.show(`播报失败: ${error.message}`);}});} else {Toast.show('请输入文本');}};build() {Flex({ direction: FlexDirection.Column, align: ItemAlign.Center, justify: FlexJustify.Center }) {TextInput({placeholder: '请输入或语音输入要播报的文本',text: this.userInput,onChange: (value) => {this.userInput = value;},disabled: this.isListening // 当正在语音识别时,禁用文本输入框}).width('100%').margin({ top: '16vp' })// 语音识别按钮Button('语音输入').onClick(() => {if (!this.isListening) {this.startListening();(this.$node as any).findComponentById('mic-icon').$element().style.display = 'block';}}).margin({ top: '16vp' }).id('voice-button')// 麦克风图标,用于视觉反馈Image($r('app/common/resources/mic.png')) // 替换为实际的麦克风图标资源路径.width('48vp').height('48vp').id('mic-icon').style({ display: 'none' }) // 初始隐藏// 播报按钮Button('播报').onClick(this.speakText).margin({ top: '16vp' })}}
}

三、效果说明

文本输入与播报:用户仍然可以通过文本输入框输入要播报的文本,并点击“播报”按钮进行播报。

语音识别:用户点击“语音输入”按钮后,应用将开始监听用户的语音输入。此时,麦克风图标将显示,表示正在监听。语音识别成功后,输入的文本将自动填充到文本输入框中,并弹出“语音识别成功”的提示框。用户可以点击“播报”按钮进行播报。

视觉反馈:在语音识别过程中,麦克风图标将显示,为用户提供视觉反馈。当语音识别结束时,图标将隐藏。

错误处理:无论是语音识别还是文本播报过程中发生错误,都会弹出相应的错误信息提示框,帮助用户了解问题所在。

我们可以根据实际需求进一步定制和扩展应用的功能。


http://www.ppmy.cn/devtools/148795.html

相关文章

开源模型应用落地-qwen2-7b-instruct-LoRA微调合并-ms-swift-单机单卡-V100(十三)

一、前言 本篇文章将使用ms-swift去合并微调后的模型权重,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。 二、术语介绍 2.1. LoRA微调 LoRA (Low-Rank Adaptation) 用于微调大型语言模型 (LLM)。 是一种有效的自适应策略,…

电子价签会是零售界的下一个主流?【新立电子】

电子价签,作为一种能够替代传统纸质标签的数字显示屏,已经在零售行业中展现出其巨大的潜力。它具有实时更新、集中管理、高效节能的特点,实现价格的实时更新,大大减少更新价格的工作量和时间。为消费者带来更加便捷、准确的购物体…

警务协同办公系统(源码+文档+部署+讲解)

引言 在现代社会,社区安全是居民幸福生活的基石。智慧警务系统,作为一个创新的数字化解决方案,通过智能化管理和服务,提升了社区安全管理的效率和质量。 系统概述 智慧警务系统采用前后端分离的架构设计,服务端基于…

使用 Spring Boot 实现钉钉消息发送消息

钉钉官方文档(Webhook同步数据) 在这篇博客中,我们将详细介绍如何使用 Spring Boot 集成钉钉机器人,构建一个发送钉钉消息的服务,并通过 OkHttp 实现 HTTP 请求,同时使用 Hutool 提供便捷的 POST 请求工具。 功能概述 本服务的主…

26考研资料分享 百度网盘

26考研资料分享考研资料合集 百度网盘(仅供参考学习) 基础班: 通过网盘分享的文件:2026【考研英语】等3个文件 链接: https://pan.baidu.com/s/1Q6rvKop3sWiL9zBHs87kAQ?pwd5qnn 提取码: 5qnn --来自百度网盘超级会员v3的分享…

【Blackbox Exporter】prober.Handler源码详细分析

http.HandleFunc(path.Join(*routePrefix, "/probe"), func(w http.ResponseWriter, r *http.Request) {sc.Lock()conf : sc.Csc.Unlock()prober.Handler(w, r, conf, logger, rh, *timeoutOffset, nil, moduleUnknownCounter, allowedLevel)})我们了解到blackbox_ex…

在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法

在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法 1. GrpcChannel 的概念 GrpcChannel 是 gRPC 客户端与服务器之间通信的核心组件。它是基于 HTTP/2 的连接,支持多路复用,即通过单个通道可以发送多…

Leetcode 3409. Longest Subsequence With Decreasing Adjacent Difference

Leetcode 3409. Longest Subsequence With Decreasing Adjacent Difference 1. 解题思路2. 代码实现 题目链接:3409. Longest Subsequence With Decreasing Adjacent Difference 1. 解题思路 这一题做的很失败,虽然只是一个medium的题目,但…