HarmonyOS 鸿蒙Next中textToSpeech音量设置问题

HarmonyOS 鸿蒙Next中textToSpeech音量设置问题

let extraParam: Record<string, Object> = { "volume": 1, "isBackStage": true, "soundChannel": 1 }
let initParamsInfo: textToSpeech.CreateEngineParams = {
  language: 'zh-CN',
  person: 0,
  online: 1,
  extraParams: extraParam
}

我使用textToSpeech来做语音播报功能,现在有个问题,就是我想要让这个播报的音量跟系统的音量一致,也就是说,我系统音量调大,播报的音量也调大,如果系统音量调到没有声音,那这个也没有声音,能做到吗?

我尝试跳过soundChannel,但是没有效果,现在在播报的时候,调节音量,是有一套播报的音量,独立于系统音量的,想知道怎么设置才能跟系统音量同步。

有大佬知道吗,帮忙解答下,谢谢~


更多关于HarmonyOS 鸿蒙Next中textToSpeech音量设置问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

【背景知识】

  • HarmonyOS的音量管理包括对系统音量、应用音量和音频流音量的管理。
    • 系统音量是由HarmonyOS系统全局管理的音量设置,适用于所有应用程序和设备。
    • 应用音量是HarmonyOS提供给三方应用用来控制该应用下所有音频流音量的一种音量类型。
    • 音频流音量是由应用独立控制的音量设置,仅影响该应用中指定的音频流输出音量大小。
  • 系统音量、应用音量和音频流音量的关系如下所示:
    • 层级关系:系统音量是全局的,应用音量和音频流音量是局部的。 应用音量和音频流音量的调整范围受系统音量的限制。例如:系统媒体音量设置为50%,应用音量设置为100%,应用程序的最终输出音量只能达到50%。 音频流音量是对应用音量的更精细化控制。设置了应用音量的三方应用,还可以继续通过音频流音量对指定的音频流进行更加精细化的控制。
    • 协同关系:应用最终的输出音量是由系统音量、应用音量和音频流音量共同决定的。例如:系统媒体音量设置为50%,应用音量设置为50%,应用程序中对媒体音频流设置音频流音量为100%,则该音频流最终输出的音量为25%。

【解决方案】

应用在实现自定义音量条的过程中,建议使用音频框架的音量变化监听接口,通过接口回调的音量类型volumeEvent.volumeType,音量等级volumeEvent.volume以及是否显示音量条volumeEvent.updateUi等信息,应用可以判断是否需要处理当前数据和显示自定义的音量条,具体可参考音量变化回调接口介绍。监听系统音量变化进而同步应用音量或者音频流音量。

  • 设置系统音量 应用无法直接调节系统音量,系统提供了ArkTS组件AVVolumePanel音量面板,应用可以创建该组件,让用户通过界面操作来调节音量。
  • 设置应用音量
    1. 管理应用音量的接口由AudioVolumeManager提供,在使用之前,需要使用getVolumeManager()获取AudioVolumeManager实例,示例代码如下:
import { audio } from '@kit.AudioKit';

let audioManager = audio.getAudioManager();
let audioVolumeManager = audioManager.getVolumeManager();
  1. 设置应用音量。 当音量模式设置为APP_INDIVIDUAL时,可通过下面示例接口设置应用音量。
// 设置应用的音量(范围为0到100)。
audioVolumeManager.setAppVolumePercentage(20).then(() => {
  console.info(`set app volume success.`);
});
  • 设置音频流音量 在ArkTS API端和Native API端分别有对应的API用来设置音频流音量。 使用ArkTS API时,开发者可以使用AVPlayer或AudioRenderer的setVolume()方法。
    • 使用AVPlayer设置音频流音量的示例代码如下:
let volume = 1.0;  // 指定的音量大小,取值范围为[0.00-1.00],1表示最大音量
avPlayer.setVolume(volume);
  • 使用AudioRenderer设置音频流音量的示例代码如下:
import { BusinessError } from '@kit.BasicServicesKit';

audioRenderer.setVolume(0.5).then(() => {  // 音量范围为[0.0-1.0]
  console.info('Invoke setVolume succeeded.');
}).catch((err: BusinessError) => {  
  console.error(`Invoke setVolume failed, code is ${err.code}, message is ${err.message}`);
});
// 要设置的音量值,音量值的范围是[0.0, 1.0]。
float volume = 0.5f;

// 设置当前音频流音量值。
OH_AudioStream_Result OH_AudioRenderer_SetVolume(audioRenderer, volume);
  • 注意
    • setVolume接口调整的是音频流本身的音量,不是系统音量,音量条本身不会发生变化,而且音频流本身的音量默认值是1,即以系统音量来播放,应用只可以在系统音量的基础上调到0~1倍,不会超过系统音量,也不会影响系统音量的值(即音量条)。
    • 为确保用户能感知音量变化,应用后台不能调节音量,否则系统会做出对应的控制措施,因此音量面板设置volumeLevel初始值是不生效的,只有改变volumeLevel值触发音量面板,才会改变当前系统音量;并且音量面板调节具体音量由系统控制,当前播放什么音频就调节什么音量,没有播放时就会调节媒体音量。

更多关于HarmonyOS 鸿蒙Next中textToSpeech音量设置问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


那textToSpeech (文本转语音)这个设置的音量volume,默认1是按照系统音量吗,我看文档上是“可选,支持范围[0-2],不传参时默认为1,使用一倍音量合成音频流”,当我在播报的时候,会有不同于系统音量的音量条设置,我不是想要自定义音量条,而是想要这个语音播报的音量跟系统音量同步,或者说基于系统音量变化,而不是有两套音量条,我测试了下华为运动健康app的运动中的语音播报,发现它是跟系统音量同步的,不知道为什么我这边调整音量是分开的,

  1. 文档中CreateEngineParams的extraParams没有volume参数,只有textToSpeech.SpeakParams才有,并且这个参数与设置音量条无关。
  2. textToSpeech使用的是AI模块的基础语音服务,音量控制为系统音量中的小艺,而不是媒体。如果期望使用系统音量中的媒体控制改音量,可以使用音频服务播放现有音频文件。

谢谢解答,原来是设置错位置了,我一直在CreateEngineParams的extraParams调整设置,导致设置没有生效,我现在在textToSpeech.SpeakParams中设置,设置soundChannel为1,因为调整就是跟系统一致了,

【背景知识】
[@ohos.multimedia.avVolumePanel](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ohos-multimedia-avvolumepanel):应用无法直接调节系统音量,可以通过系统音量面板,让用户通过界面操作来调节音量。当用户通过应用内音量面板调节音量时,系统会展示音量提示界面,显性地提示用户系统音量发生改变。

【参考方案】:

可参考滑块及进度条自定义示例,通过音量面板实现了调整系统音量大小的效果。

  1. 通过[@ohos.multimedia.avVolumePanel](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ohos-multimedia-avvolumepanel)调用音量面板,改变volume的值来调节音量。
@Provide volume: number = 5
AVVolumePanel({
  volumeLevel: this.volume
})
  .zIndex(Number($r('app.float.avvolumepanel_zindex')))
  .width($r('app.string.avvolumepanel_width'))

在HarmonyOS Next中,TextToSpeech音量可通过AudioVolumeManager进行设置。使用setVolume方法指定音量级别,范围通常为0.0到1.0。需先获取AudioVolumeType.SPEECH类型的音量管理器实例,再调用相关接口调整。音量设置依赖于系统音频策略,部分场景可能受设备限制。

在HarmonyOS Next中,textToSpeech的默认行为是与系统媒体音量同步的,不需要额外设置。如果遇到音量独立的情况,请检查是否在代码中显式设置了volume参数。移除extraParam中的"volume": 1即可恢复与系统音量的同步。例如:

let extraParam: Record<string, Object> = { "isBackStage": true, "soundChannel": 1 };

这样,语音播报音量将直接跟随系统媒体音量变化。

回到顶部