Files
hospital-rescue-app-v2/uni_modules/x-texttovoice-s/utssdk/app-harmony/index.uts
T
2026-09-24 16:25:22 +08:00

94 lines
2.9 KiB
Plaintext

import { XuiTextToVoiceOpts, XuiTextToVoiceResult, XTTSImpl } from "../interface.uts"
import { XuiTextToVoiceFailImpl } from "../unierror.uts"
import { textToSpeech } from '@kit.CoreSpeechKit';
import { BusinessError } from '@kit.BasicServicesKit';
let tts : textToSpeech.TextToSpeechEngine | null = null;
class TtsObj implements XTTSImpl {
config : XuiTextToVoiceOpts;
constructor(opts : XuiTextToVoiceOpts) {
this.config = opts;
}
isPlaying() : boolean {
return tts?.isBusy() ?? false
}
play(c : string) {
// 设置播报相关参数
let extraParam:Record<string, Object> = {
"queueMode": 0, "speed": 0.9, "pitch": 1, "languageContext": 'zh-CN',
"audioType": "pcm", "soundChannel": 3, "playType": 1
};
let speakParams : textToSpeech.SpeakParams = {
requestId: Math.random().toString(16).substring(4),
extraParams: extraParam
};
tts?.speak(c, speakParams);
}
stop() {
tts?.stop()
tts?.shutdown()
}
}
let TtsObjIml : TtsObj | null = null;
export class xTtsImplIns {
public static play(c : string) {
TtsObjIml?.play(c)
}
public static isPlaying() : boolean {
return TtsObjIml?.isPlaying() ?? false
}
public static stop() {
TtsObjIml?.stop()
}
}
export function XTtsSpeek(opts : XuiTextToVoiceOpts) {
tts = null;
let extraParam:Record<string, Object> = { "style": 'interaction-broadcast', "locate": 'CN', "name": 'EngineName' };
let initParamsInfo : textToSpeech.CreateEngineParams = {
language: 'zh-CN',
person: 0,
online: 1,
extraParams: extraParam
};
let speakListener : textToSpeech.SpeakListener = {
// 开始播报回调
onStart(requestId : string, response : textToSpeech.StartResponse) {
opts.onStart?.()
},
// 合成完成及播报完成回调
onComplete(requestId : string, response : textToSpeech.CompleteResponse) {
opts.onDone?.()
},
// 停止播报回调
onStop(requestId : string, response : textToSpeech.StopResponse) {
opts.onStop?.()
},
// 返回音频流
onData(requestId : string, audio : ArrayBuffer, response : textToSpeech.SynthesisResponse) {
},
// 错误回调
onError(requestId : string, errorCode : number, errorMessage : string) {
console.error(`onError, requestId: ${requestId} errorCode: ${errorCode} errorMessage: ${errorMessage}`);
opts.onError?.(new XuiTextToVoiceFailImpl(1004))
}
};
// 调用createEngine方法
textToSpeech.createEngine(initParamsInfo, (err : BusinessError, textToSpeechEngine : textToSpeech.TextToSpeechEngine) => {
if (!err) {
console.info('Succeeded in creating engine');
// 接收创建引擎的实例
tts = textToSpeechEngine;
tts!.setListener(speakListener);
TtsObjIml = new TtsObj(opts)
opts.success?.(TtsObjIml!)
opts.complete?.(null)
} else {
console.error(`Failed to create engine. Code: ${err.code}, message: ${err.message}.`);
opts.fail?.(new XuiTextToVoiceFailImpl(1001))
opts.complete?.(null)
}
});
}