HarmonyOS之AI能力·语音播报

Posted Forever_wj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HarmonyOS之AI能力·语音播报相关的知识,希望对你有一定的参考价值。

一、概念

  • 语音播报(Text to Speech,下文简称 TTS),基于华为智慧引擎(HUAWEI HiAI Engine)中的语音播报引擎,向开发者提供人工智能应用层 API。该技术提供将文本转换为语音并进行播报的能力。
  • 支持超长文本播报,最大文本长度为 100000 个字符。
  • 语音播报不支持多线程调用。

二、应用场景

  • 实时语音交互:生成音频信息用于语音交互。例如:与智能音箱或手机智能助手的交互,后台会将回答信息以音频方式进行语音播报。
  • 超长文本播报:用于小说、新闻等较长文本的自动朗读。

三、API 说明

  • 语音播报功能提供了 TtsClient 类实现文本转语音功能,该类的主要接口如下表所示:
接口名描述
void create(Context context, TtsListener ttsListener)创建TTS客户端。context为应用的上下文;ttsListener为TTS回调,可以在TtsListener的onEvent方法中获取创建结果(成功或失败),只有在收到创建TTS客户端成功回调之后,才能进行TTS客户端的初始化。
void release()释放正在使用的TTS引擎。调用此方法会将初始化状态置为false,并结束播报任务,建议在init(TtsParams)前调用
boolean init(TtsParams ttsParams)初始化TTS客户端。设置deviceId、deviceType、语速、音量、音调、音色参数,其中deviceId必须设置,否则初始化失败
boolean setParams(TtsParams ttsParams)设置参数。支持设置音量、音调、语速、音色四个参数的修改,修改其他值无效,在init(TtsParams)之后调用,否则设置不生效
boolean setAudioType(AudioManager.AudioVolumeType audioType)设置音频流类型。目前支持AudioVolumeType.STREAM_MUSIC等九种音频流类型的设置,可在播报前调用
void speakText(String text, String utteranceId)合成音频并播报。传入需播报的文本即可合成音频并播报,支持的最大文本长度为512个字符,若文本超长或文本为空将会报错,并将错误结果通过回调TtsListener的onError(String,String)方法传给调用者。utteranceId为播报请求的唯一标识,若utteranceId为空,TTS引擎将为本次请求随机生成utteranceId
void speakLongText(String longText, String utteranceId)连续合成并播报超长文本。文本最大支持长度为100000,若文本超过最大支持长度或文本为空将会报错,并将错误结果通过TtsListener的onError(String,String)方法传给调用者
boolean isSpeaking()判断是否正在进行TTS播报。如果正在进行TTS播报,返回true;否则,返回false
void stopSpeak()停止TTS播报。调用此方法停止播报后,若再次播报,将会从头开始播报,而不是从停止处播报
Optional getVersion()获取TTS SDK版本号
void destroy()销毁TTS客户端。完成所有任务后,务必调用此方法销毁TTS客户端
  • TtsListener 中 onEvent 的 eventType 对照表:
eventType取值描述
TtsEvent.CREATE_TTS_CLIENT_SUCCESS创建TTS客户端成功
TtsEvent.CREATE_TTS_CLIENT_FAILED创建TTS客户端失败
TtsEvent.DESTROY_TTS_CLIENT_SUCCESS销毁TTS客户端成功
TtsEvent.METHOD_EXECUTE_SUCCESS方法执行成功或方法执行无异常时,返回此事件类型。对应的方法可以通过pacMap.getIntValue(TtsClient.PAC_MAP_KEY_METHOD_ID)获取
TtsEvent.METHOD_EXECUTE_FAILED_REMOTE_EXCEPTION方法执行失败或异常。对应的方法可以通过pacMap.getIntValue(TtsClient.PAC_MAP_KEY_METHOD_ID)获取
TtsEvent.DESTROY_TTS_CLIENT_FAILED销毁TTS客户端失败或未成功创建TTS客户端时,调用destroy方法,返回此事件类型
  • method ID 与方法对照表:
method Id方法
TtsClient.METHOD_CREATEcreate
TtsClient.METHOD_DESTROYdestroy
TtsClient.METHOD_RELEASErelease
TtsClient.METHOD_SPEAK_LONG_TEXTspeakLongText
TtsClient.METHOD_SPEAK_TEXTspeakText
TtsClient.METHOD_STOP_SPEAKstopSpeak

四、开发流程

  • 导入相关的类:
	import ohos.ai.tts.TtsClient; // TTS接口
	import ohos.ai.tts.TtsListener; // TTS回调
	import ohos.ai.tts.TtsParams; // TTS参数
	import ohos.ai.tts.constants.TtsEvent; // TTS事件
	import ohos.utils.PacMap; // TTS依赖
  • 创建与 TTS 服务的连接。context 为应用上下文信息,应为 ohos.aafwk.ability.Ability 或 ohos.aafwk.ability.AbilitySlice 的实例或子类实例:
	private static final TtsListener ttsListener = new TtsListener() {
	        @Override
	        public void onEvent(int eventType, PacMap pacMap) {
	            // Log.info("onEvent:" + eventType);
	            if (eventType == TtsEvent.CREATE_TTS_CLIENT_SUCCESS) {
	                // Log.info("TTS Client create success");
	            }
	        }
	 
	        @Override
	        public void onStart(String utteranceId) {
	            // Log.info(utteranceId + " audio synthesis begins");
	        }
	 
	        @Override
	        public void onProgress(String utteranceId, byte[] audioData, int progress) {
	            // Log.info(utteranceId + " audio synthesis progress:" + progress);
	        }
	 
	        @Override
	        public void onFinish(String utteranceId) {
	            // Log.info(utteranceId + " audio synthesis completed");
	        }
	 
	        @Override
	        public void onSpeechStart(String utteranceId) {
	            // Log.info(utteranceId + " begins to speech");
	        }
	 
	        @Override
	        public void onSpeechProgressChanged(String utteranceId, int progress) {
	            // Log.info(utteranceId + " speech progress:" + progress);
	        }
	 
	        @Override
	        public void onSpeechFinish(String utteranceId) {
	            // Log.info(utteranceId + " speech completed");
	        }
	 
	        @Override
	        public void onError(String utteranceId, String errorMessage) {
	            // Log.info(utteranceId + " errorMessage: " + errorMessage);
	        }
	};
	TtsClient.getInstance().create(context, ttsListener);
  • 在 TTS 接口创建成功后初始化 TTS 引擎:
	TtsParams ttsParams = new TtsParams();
	ttsParams.setDeviceId("your device id");
	boolean initResult = TtsClient.getInstance().init(ttsParams);
  • 初始化 TTS 引擎成功后调用音频转换并播放接口:
	if (initResult) {
	    TtsClient.getInstance().speakText("欢迎使用语音播报!", null);
	}
  • 使用完成后销毁 TTS 客户端:
	TtsClient.getInstance().destroy();

以上是关于HarmonyOS之AI能力·语音播报的主要内容,如果未能解决你的问题,请参考以下文章

HarmonyOS Sample 之 AI能力之NLU引擎服务

HarmonyOS Sample 之 AI能力应用之 报菜名儿

HarmonyOS之AI能力·分词

HarmonyOS之AI能力·通用文字识别技术

HarmonyOS之AI能力·词性标注

HarmonyOS之AI能力·实体识别