HarmonyOS鸿蒙Next中文字转语音TTS如何暂停后可以继续播放剩余内容

HarmonyOS鸿蒙Next中文字转语音TTS如何暂停后可以继续播放剩余内容 鸿蒙文字转语音TTS 如何暂停后 可以继续播放 剩余内容,监听onData事件不触发,有大佬做过吗求救,求个简化demo

7 回复

官方api中并未提供暂停播报后继续播报的api。

开发者可以选择使用监听onData 接口:合成播报过程中回调此接口,返回请求ID,音频流信息,音频附加信息如格式、时长等。

如果未返回音频流信息,可能是参数设置问题:

请修改extraParams 参数中的playType参数为0

  • <'playType', number> 合成类型。

可选,不传参时默认为1。

0:仅合成不播报,返回音频流。

1:合成与播报不返回音频流。

等待onComplete 接收完所有音频流之后,再自己创建一个AudioRenderer 的 player去播放这个音频流就行了,到时候暂停什么的就可以自己控制了。

更详细代码请参见文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/texttospeech-guide

更多关于HarmonyOS鸿蒙Next中文字转语音TTS如何暂停后可以继续播放剩余内容的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


感谢大佬!,

想问下 tts合成的音频存沙箱 avplayer不能播放

let context = getContext(this) as common.UIAbilityContext;
let pathDir = context.filesDir;
let path = pathDir + '/aaa.mp3';
// 打开相应的资源文件地址获取fd,并为url赋值触发initialized状态机上报
let file = await fs.open(path);
fdPath = fdPath  + file.fd;
this.player.playUrl(fdPath),
playUrl(url:string){
  if (this.avplayer) {
    this.avplayer.url = url
    this.avplayer.play()
  }
}

在HarmonyOS Next中,通过TTS播放器实例的pause()方法暂停语音播放,再调用play()方法即可从暂停位置继续播放剩余内容。

在HarmonyOS Next中,实现TTS暂停后继续播放剩余内容,关键在于正确管理AVPlayer实例和播放状态。onData事件不触发通常是因为播放器状态未正确处理。

以下是核心实现步骤和简化示例:

1. 核心思路

  • 使用AVPlayer进行TTS播放。
  • 暂停时,不要释放AVPlayer实例,仅调用pause()
  • 继续播放时,直接调用play(),播放器会从当前位置继续播放剩余音频数据。

2. 关键代码示例

import { avPlayer, media } from '@kit.AVPlayerKit';
import { BusinessError } from '@kit.BasicServicesKit';

// 1. 创建并配置AVPlayer实例(作为成员变量,避免被回收)
let avPlayerInstance: avPlayer.AVPlayer | null = null;

async function initAndPlayTTS(text: string) {
  // 初始化TTS引擎并获取音频流URI(此处省略TTS引擎初始化和文本合成步骤)
  // 假设已获得音频URI: audioUri

  if (!avPlayerInstance) {
    // 首次创建AVPlayer
    avPlayerInstance = await media.createAVPlayer();
    avPlayerInstance.on('stateChange', (state: string) => {
      if (state === 'paused') {
        // 暂停状态,可在此记录日志或更新UI
        console.log('TTS已暂停');
      }
      if (state === 'playing') {
        console.log('TTS播放中');
      }
      if (state === 'completed') {
        // 播放完成,可释放资源
        avPlayerInstance.release();
        avPlayerInstance = null;
      }
    });
  }

  // 设置音频源并准备播放
  avPlayerInstance.url = audioUri;
  await avPlayerInstance.prepare();
  avPlayerInstance.play();
}

// 3. 暂停播放
function pauseTTS() {
  if (avPlayerInstance && avPlayerInstance.state === 'playing') {
    avPlayerInstance.pause(); // 关键:仅暂停,不释放
  }
}

// 4. 继续播放
function resumeTTS() {
  if (avPlayerInstance && avPlayerInstance.state === 'paused') {
    avPlayerInstance.play(); // 从暂停位置继续播放
  }
}

// 5. 停止并释放(需要重新播放时需重新初始化)
function stopAndReleaseTTS() {
  if (avPlayerInstance) {
    avPlayerInstance.stop();
    avPlayerInstance.release();
    avPlayerInstance = null;
  }
}

3. 注意事项

  • 状态管理:通过监听stateChange事件来跟踪播放器状态(playingpausedcompleted等),这是控制播放流程的基础。
  • 资源释放:仅在播放完成或确定不再需要时调用release()。暂停期间保持AVPlayer实例存活。
  • 错误处理:建议添加error事件监听,处理合成或播放过程中的异常。
  • onData事件:如果指的是TTS引擎的数据回调,在鸿蒙Next中,通常直接使用AVPlayer播放最终合成的音频流,无需监听中间数据。若需处理流式数据,需检查TTS引擎接口是否支持。

4. 简化流程

  1. initAndPlayTTS():初始化/复用播放器,设置URI并开始播放。
  2. pauseTTS():调用avPlayerInstance.pause()
  3. resumeTTS():调用avPlayerInstance.play()
  4. 播放完成后,播放器会自动进入completed状态,可在回调中释放资源。

按照以上方式,即可实现暂停后继续播放剩余内容的功能。

回到顶部