
TTS(Text-to-Speech)是HarmonyOS提供的重要语音服务能力,可以将文本内容转换为语音播放。本文基于实际项目经验,详细介绍如何在HarmonyOS应用中使用TTS功能。

import { textToSpeech } from '@kit.CoreSpeechKit'
import { BusinessError } from '@ohos.base'包说明:
@kit.CoreSpeechKit:HarmonyOS核心语音服务包,提供TTS、语音识别等语音相关功能@ohos.base:HarmonyOS基础类型定义包,提供错误处理等基础功能在 module.json5 中需要申请相关权限:
{
"requestPermissions": [
{
"name": "ohos.permission.MICROPHONE",
"reason": "用于语音识别功能采集麦克风音频,进行语音转文字。",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "always"
}
},
{
"name": "ohos.permission.INTERNET",
"reason": "用于联网获取或发送与语音能力相关的数据。",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "always"
}
}
]
}export class TTSManager {
private tts: textToSpeech.TextToSpeechEngine | null = null
private playing: boolean = false
private paused: boolean = false
private log: string = ''
private onPlayingStateChange: (playing: boolean, paused: boolean) => void = () => {}
private onLogChange: (log: string) => void = () => {}
private userStopped: boolean = false
private currentText: string = ''
constructor(
onPlayingStateChange?: (playing: boolean) => void,
onLogChange?: (log: string) => void
) {
if (onPlayingStateChange) {
this.onPlayingStateChange = (playing, paused) => {
onPlayingStateChange(playing)
}
}
if (onLogChange) {
this.onLogChange = onLogChange
}
this.initTTS()
}
}private initTTS(): void {
const params: textToSpeech.CreateEngineParams = {
language: 'zh-CN', // 设置语言为中文
person: 0, // 设置发音人(0为默认发音人)
online: 1 // 设置为在线模式(1为在线,0为离线)
}
textToSpeech.createEngine(params, (err: BusinessError, engine: textToSpeech.TextToSpeechEngine) => {
if (err || !engine) {
this.updateLog(`创建TTS引擎失败: ${err?.message}`)
return
}
this.tts = engine
this.setListener()
})
}参数说明:
language:语音语言,支持 ‘zh-CN’(中文)、‘en-US’(英文)等person:发音人选择,0为默认发音人online:在线/离线模式,1为在线模式(需要网络),0为离线模式private setListener(): void {
if (!this.tts) return
const listener: textToSpeech.SpeakListener = {
onStart: (id, rsp) => {
if (!this.paused) {
this.userStopped = false
}
this.updatePlaying(true, false)
this.updateLog('开始播报')
},
onComplete: (id, rsp) => {
if (rsp && rsp.type === 1) {
this.updateLog('播报完成')
}
},
onStop: (id, rsp) => {
// 停止事件处理
},
onData: (id, audio, rsp) => {
// 收到音频数据
},
onError: (id, code, msg) => {
this.updateLog(`TTS错误(${code}): ${msg}`)
}
}
this.tts.setListener(listener)
}监听器事件说明:
onStart:开始播放时触发onComplete:播放完成时触发onStop:停止播放时触发onData:接收到音频数据时触发onError:发生错误时触发public speak(text: string): void {
if (!this.tts) {
this.updateLog('TTS未就绪')
return
}
// 重置状态
this.userStopped = false
this.paused = false
this.currentText = text
// 过滤文本
const filtered = this.filterText(text)
const speakParams: textToSpeech.SpeakParams = {
requestId: 'tts_' + Date.now()
}
try {
this.tts.speak(filtered, speakParams)
} catch (e) {
this.updateLog(`播报失败: ${JSON.stringify(e)}`)
}
}使用示例:
// 创建TTS管理器实例
const ttsManager = new TTSManager(
(playing) => {
console.log('播放状态:', playing)
},
(log) => {
console.log('TTS日志:', log)
}
)
// 播放文本
ttsManager.speak('你好,欢迎使用HarmonyOS TTS功能!')public stop(): void {
try {
this.userStopped = true
this.paused = false
this.updatePlaying(false, false)
this.tts?.stop()
this.updateLog('已停止播报')
} catch (e) {
this.updateLog(`停止失败: ${JSON.stringify(e)}`)
}
}使用示例:
// 停止当前播放
ttsManager.stop()private filterText(text: string): string {
return text
.replace(/[\u{1F600}-\u{1F64F}]/gu, '') // 移除表情符号
.replace(/[\u{1F300}-\u{1F5FF}]/gu, '') // 移除符号和象形图
.replace(/[\u{1F680}-\u{1F6FF}]/gu, '') // 移除交通和地图符号
.replace(/[\u{2600}-\u{26FF}]/gu, '') // 移除杂项符号
.replace(/[\u{1F900}-\u{1F9FF}]/gu, '') // 移除补充符号
.replace(/[:;=][)(\]>DPdpO0\-]+/g, '') // 移除文本表情
.replace(/[\s]+/g, ' ') // 合并多余空格
}// 获取播放状态
public isPlaying(): boolean {
return this.playing
}
// 获取暂停状态
public isPaused(): boolean {
return this.paused
}
// 获取日志
public getLog(): string {
return this.log
}
// 更新播放状态
private updatePlaying(playing: boolean, paused?: boolean): void {
this.playing = playing
if (paused !== undefined) {
this.paused = paused
}
this.onPlayingStateChange(playing, this.paused)
}
// 更新日志
private updateLog(log: string): void {
this.log = log
this.onLogChange(log)
}@Entry
@Component
struct Index {
@State isSpeaking: boolean = false
private ttsManager: TTSManager = new TTSManager(
(playing) => { this.isSpeaking = playing },
(log) => { this.addLog('TTS', log) }
)
// 朗读文本
speakText() {
if (!this.currentText.trim()) {
this.addLog('朗读失败', '没有可朗读的内容')
return
}
this.ttsManager.speak(this.currentText)
this.addLog('开始朗读', `开始朗读文本,长度: ${this.currentText.length}字符`)
}
// 停止朗读
stopSpeaking() {
if (this.isSpeaking) {
this.ttsManager.stop()
this.addLog('停止朗读', '已停止朗读')
}
}
aboutToDisappear() {
this.ttsManager.shutdown()
}
}build() {
Column() {
// 播放/停止按钮
Button(this.isSpeaking ? '停止朗读' : '朗读')
.onClick(() => {
if (this.isSpeaking) {
this.stopSpeaking()
} else {
this.speakText()
}
})
.backgroundColor(this.isSpeaking ? '#FF6B6B' : '#40E0D0')
.fontColor(Color.White)
.borderRadius(8)
.width(80)
.height(40)
}
}public shutdown(): void {
if (this.tts) {
try {
this.tts.shutdown()
} catch (e) {
console.error(`关闭TTS引擎失败: ${JSON.stringify(e)}`)
}
this.tts = null
}
}重要提醒: 在页面销毁时务必调用 shutdown() 方法释放TTS资源,避免内存泄漏。
// 1. 创建TTS管理器
const ttsManager = new TTSManager(
(playing) => {
console.log('TTS播放状态:', playing)
},
(log) => {
console.log('TTS日志:', log)
}
)
// 2. 播放文本
ttsManager.speak('这是一段测试文本,用于验证TTS功能是否正常工作。')
// 3. 检查播放状态
if (ttsManager.isPlaying()) {
console.log('正在播放中...')
}
// 4. 停止播放
ttsManager.stop()
// 5. 释放资源
ttsManager.shutdown()HarmonyOS TTS功能为应用提供了强大的语音播报能力,通过合理的使用和优化,可以为用户提供更好的交互体验。本文详细介绍了TTS的完整使用流程,包括初始化、播放控制、状态管理和资源释放等关键环节,希望对开发者有所帮助。