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
【背景知识】
- HarmonyOS的音量管理包括对系统音量、应用音量和音频流音量的管理。
- 系统音量是由HarmonyOS系统全局管理的音量设置,适用于所有应用程序和设备。
- 应用音量是HarmonyOS提供给三方应用用来控制该应用下所有音频流音量的一种音量类型。
- 音频流音量是由应用独立控制的音量设置,仅影响该应用中指定的音频流输出音量大小。
- 系统音量、应用音量和音频流音量的关系如下所示:
- 层级关系:系统音量是全局的,应用音量和音频流音量是局部的。 应用音量和音频流音量的调整范围受系统音量的限制。例如:系统媒体音量设置为50%,应用音量设置为100%,应用程序的最终输出音量只能达到50%。 音频流音量是对应用音量的更精细化控制。设置了应用音量的三方应用,还可以继续通过音频流音量对指定的音频流进行更加精细化的控制。
- 协同关系:应用最终的输出音量是由系统音量、应用音量和音频流音量共同决定的。例如:系统媒体音量设置为50%,应用音量设置为50%,应用程序中对媒体音频流设置音频流音量为100%,则该音频流最终输出的音量为25%。
【解决方案】
应用在实现自定义音量条的过程中,建议使用音频框架的音量变化监听接口,通过接口回调的音量类型volumeEvent.volumeType,音量等级volumeEvent.volume以及是否显示音量条volumeEvent.updateUi等信息,应用可以判断是否需要处理当前数据和显示自定义的音量条,具体可参考音量变化回调接口介绍。监听系统音量变化进而同步应用音量或者音频流音量。
- 设置系统音量 应用无法直接调节系统音量,系统提供了ArkTS组件AVVolumePanel音量面板,应用可以创建该组件,让用户通过界面操作来调节音量。
- 设置应用音量
- 管理应用音量的接口由AudioVolumeManager提供,在使用之前,需要使用getVolumeManager()获取AudioVolumeManager实例,示例代码如下:
import { audio } from '@kit.AudioKit';
let audioManager = audio.getAudioManager();
let audioVolumeManager = audioManager.getVolumeManager();
- 设置应用音量。 当音量模式设置为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}`);
});
- 使用Native API时开发者可使用OH_AudioRenderer_SetVolume接口设置当前音频流音量值,示例代码如下:
// 要设置的音量值,音量值的范围是[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的运动中的语音播报,发现它是跟系统音量同步的,不知道为什么我这边调整音量是分开的,
- 文档中CreateEngineParams的extraParams没有volume参数,只有textToSpeech.SpeakParams才有,并且这个参数与设置音量条无关。
- textToSpeech使用的是AI模块的基础语音服务,音量控制为系统音量中的小艺,而不是媒体。如果期望使用系统音量中的媒体控制改音量,可以使用音频服务播放现有音频文件。
谢谢解答,原来是设置错位置了,我一直在CreateEngineParams的extraParams调整设置,导致设置没有生效,我现在在textToSpeech.SpeakParams中设置,设置soundChannel为1,因为调整就是跟系统一致了,
【背景知识】
[@ohos.multimedia.avVolumePanel](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ohos-multimedia-avvolumepanel):应用无法直接调节系统音量,可以通过系统音量面板,让用户通过界面操作来调节音量。当用户通过应用内音量面板调节音量时,系统会展示音量提示界面,显性地提示用户系统音量发生改变。
【参考方案】:
可参考滑块及进度条自定义示例,通过音量面板实现了调整系统音量大小的效果。
- 通过[@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 };
这样,语音播报音量将直接跟随系统媒体音量变化。