|
|
@@ -1,214 +1,102 @@
|
|
|
-import { textToSpeech } from '@kit.CoreSpeechKit';
|
|
|
-import { BusinessError } from '@kit.BasicServicesKit';
|
|
|
+import { EmptyComp } from "../components/EmptyComp"
|
|
|
+import { SecondViewModel } from "../viewModel/SecondViewModel"
|
|
|
|
|
|
-let ttsEngine: textToSpeech.TextToSpeechEngine;
|
|
|
-
|
|
|
-
|
|
|
-@Component
|
|
|
+@ComponentV2
|
|
|
export struct SecondView {
|
|
|
- @State createCount: number = 0;
|
|
|
- @State voiceInfo: string = "";
|
|
|
- @State originalText: string = "支付宝到账[n2]1000000元";
|
|
|
+ @Local vm:SecondViewModel = new SecondViewModel()
|
|
|
|
|
|
build() {
|
|
|
- Column() {
|
|
|
- Scroll() {
|
|
|
- Column() {
|
|
|
- TextArea({ placeholder: 'Please enter tts original text', text: `${this.originalText}` })
|
|
|
- .margin(20)
|
|
|
- .border({
|
|
|
- width: 5,
|
|
|
- color: 0x317AE7,
|
|
|
- radius: 10,
|
|
|
- style: BorderStyle.Solid
|
|
|
- })
|
|
|
- .onChange((value: string) => {
|
|
|
- this.originalText = value;
|
|
|
- console.info(`original text: ${this.originalText}`);
|
|
|
- })
|
|
|
- Button() {
|
|
|
- Text("CreateEngineByCallback")
|
|
|
- .fontColor(Color.White)
|
|
|
- .fontSize(20)
|
|
|
- }
|
|
|
- .type(ButtonType.Capsule)
|
|
|
- .backgroundColor("#0x317AE7")
|
|
|
- .width("80%")
|
|
|
- .height(50)
|
|
|
- .margin(10)
|
|
|
- .onClick(() => {
|
|
|
- this.createCount++;
|
|
|
- console.info(`CreateTtsEngine:createCount:${this.createCount}`);
|
|
|
- this.createByCallback();
|
|
|
- })
|
|
|
-
|
|
|
- Button() {
|
|
|
- Text("speak")
|
|
|
- .fontColor(Color.White)
|
|
|
- .fontSize(20)
|
|
|
- }
|
|
|
- .type(ButtonType.Capsule)
|
|
|
- .backgroundColor("#0x317AE7")
|
|
|
- .width("80%")
|
|
|
- .height(50)
|
|
|
- .margin(10)
|
|
|
- .onClick(() => {
|
|
|
- this.createCount++;
|
|
|
- this.speak();
|
|
|
- })
|
|
|
-
|
|
|
- Button() {
|
|
|
- Text("listVoicesCallback")
|
|
|
- .fontColor(Color.White)
|
|
|
- .fontSize(20)
|
|
|
- }
|
|
|
- .type(ButtonType.Capsule)
|
|
|
- .backgroundColor("#0x317AE7")
|
|
|
- .width("80%")
|
|
|
- .height(50)
|
|
|
- .margin(10)
|
|
|
- .onClick(() => {
|
|
|
- this.listVoicesCallback();
|
|
|
- })
|
|
|
+ Column(){
|
|
|
+ Row(){
|
|
|
+ Text('座位表')
|
|
|
+ .fontSize(24)
|
|
|
+ .fontWeight(600)
|
|
|
+ .fontColor('#333333')
|
|
|
+ Text('添加')
|
|
|
+ .fontSize(18)
|
|
|
+ .fontWeight(500)
|
|
|
+ .borderRadius(8)
|
|
|
+ .fontColor(Color.White)
|
|
|
+ .backgroundColor(Color.Black)
|
|
|
+ .padding({left: 15, top: 7, right: 15, bottom: 7})
|
|
|
+ .onClick(() => { this.vm._onAddSeatTable() })
|
|
|
+ }
|
|
|
+ .width("100%")
|
|
|
+ .justifyContent(FlexAlign.SpaceBetween)
|
|
|
|
|
|
- Button() {
|
|
|
- Text("stop")
|
|
|
- .fontColor(Color.White)
|
|
|
- .fontSize(20)
|
|
|
- }
|
|
|
- .type(ButtonType.Capsule)
|
|
|
- .backgroundColor("#0x317AE7")
|
|
|
- .width("80%")
|
|
|
- .height(50)
|
|
|
- .margin(10)
|
|
|
- .onClick(() => {
|
|
|
- // 停止播报
|
|
|
- console.info("Stop button clicked.");
|
|
|
- ttsEngine.stop();
|
|
|
- })
|
|
|
+ Column(){
|
|
|
+ EmptyComp({ isEmpty: this.vm.dataSource.length == 0 }){
|
|
|
+ List({space: 16}){
|
|
|
+ ForEach(this.vm.dataSource, (item: string, index) => {
|
|
|
+ ListItem(){
|
|
|
+ Column({space: 5}){
|
|
|
+ Text(item)
|
|
|
+ .fontSize(20)
|
|
|
+ .fontWeight(500)
|
|
|
|
|
|
- Button() {
|
|
|
- Text("isBusy")
|
|
|
- .fontColor(Color.White)
|
|
|
- .fontSize(20)
|
|
|
- }
|
|
|
- .type(ButtonType.Capsule)
|
|
|
- .backgroundColor("#0x317AE7")
|
|
|
- .width("80%")
|
|
|
- .height(50)
|
|
|
- .margin(10)
|
|
|
- .onClick(() => {
|
|
|
- // 查询播报状态
|
|
|
- let isBusy = ttsEngine.isBusy();
|
|
|
- console.info(`isBusy: ${isBusy}`);
|
|
|
- })
|
|
|
-
|
|
|
- Button() {
|
|
|
- Text("shutdown")
|
|
|
- .fontColor(Color.White)
|
|
|
- .fontSize(20)
|
|
|
+ Text('2025.11.10-2025.9-19')
|
|
|
+ .fontSize(14)
|
|
|
+ .fontColor('#666666')
|
|
|
+ }
|
|
|
+ .width("97%")
|
|
|
+ .borderRadius(15)
|
|
|
+ .margin({left: 3})
|
|
|
+ .justifyContent(FlexAlign.Start)
|
|
|
+ .alignItems(HorizontalAlign.Start)
|
|
|
+ .backgroundImageSize(ImageSize.Cover)
|
|
|
+ .backgroundImage($r('app.media.seatBg'))
|
|
|
+ .shadow({ radius: 6, color: '#1a000000' })
|
|
|
+ .padding({left: 12, top: 20, right: 12, bottom: 20})
|
|
|
+ }
|
|
|
+ .align(Alignment.Center)
|
|
|
+ .swipeAction({
|
|
|
+ end: () => { this.swiperAction(index) }
|
|
|
+ })
|
|
|
+ })
|
|
|
}
|
|
|
- .type(ButtonType.Capsule)
|
|
|
- .backgroundColor("#0x317AA7")
|
|
|
- .width("80%")
|
|
|
- .height(50)
|
|
|
- .margin(10)
|
|
|
- .onClick(() => {
|
|
|
- // 释放引擎
|
|
|
- ttsEngine.shutdown();
|
|
|
- })
|
|
|
+ .width("100%")
|
|
|
+ .height("100%")
|
|
|
+ .padding({top: 16, bottom: 16})
|
|
|
+ .scrollBar(BarState.Off)
|
|
|
}
|
|
|
- .layoutWeight(1)
|
|
|
}
|
|
|
.width('100%')
|
|
|
- .height('100%')
|
|
|
+ .layoutWeight(1)
|
|
|
}
|
|
|
+ .width('100%')
|
|
|
+ .height('100%')
|
|
|
+ .alignItems(HorizontalAlign.Center)
|
|
|
+ .justifyContent(FlexAlign.Start)
|
|
|
+ .padding({top: this.vm.safeTop, left: 16, right: 16})
|
|
|
}
|
|
|
|
|
|
- // 创建引擎,通过callback形式返回
|
|
|
- private createByCallback() {
|
|
|
- // 设置创建引擎参数
|
|
|
- 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
|
|
|
- };
|
|
|
- // 调用createEngine方法
|
|
|
- textToSpeech.createEngine(initParamsInfo,
|
|
|
- (err: BusinessError, textToSpeechEngine: textToSpeech.TextToSpeechEngine) => {
|
|
|
- if (!err) {
|
|
|
- console.info('Succeeded in creating engine.');
|
|
|
- // 接收创建引擎的实例
|
|
|
- ttsEngine = textToSpeechEngine;
|
|
|
- } else {
|
|
|
- console.error(`Failed to create engine. Code: ${err.code}, message: ${err.message}.`);
|
|
|
- }
|
|
|
- });
|
|
|
- };
|
|
|
+ @Builder
|
|
|
+ swiperAction(index: number){
|
|
|
+ Row(){
|
|
|
+ Row(){
|
|
|
+ Image($r('app.media.icon_edit'))
|
|
|
+ .width(25)
|
|
|
+ .aspectRatio(1)
|
|
|
+ }
|
|
|
+ .backgroundColor('#BFBFBF')
|
|
|
+ .alignItems(VerticalAlign.Center)
|
|
|
+ .justifyContent(FlexAlign.Center)
|
|
|
+ .padding({ left: 18, top: 30, right: 18, bottom: 30 })
|
|
|
+ .onClick(() => { this.vm._onEditSeatTable() })
|
|
|
|
|
|
- // 调用speak播报方法
|
|
|
- private speak() {
|
|
|
- let speakListener: textToSpeech.SpeakListener = {
|
|
|
- // 开始播报回调
|
|
|
- onStart(requestId: string, response: textToSpeech.StartResponse) {
|
|
|
- console.info(`onStart, requestId: ${requestId} response: ${JSON.stringify(response)}`);
|
|
|
- },
|
|
|
- // 完成播报回调
|
|
|
- onComplete(requestId: string, response: textToSpeech.CompleteResponse) {
|
|
|
- console.info(`onComplete, requestId: ${requestId} response: ${JSON.stringify(response)}`);
|
|
|
- },
|
|
|
- // 停止播报完成回调,调用stop方法并完成时会触发此回调
|
|
|
- onStop(requestId: string, response: textToSpeech.StopResponse) {
|
|
|
- console.info(`onStop, requestId: ${requestId} response: ${JSON.stringify(response)}`);
|
|
|
- },
|
|
|
- // 返回音频流
|
|
|
- onData(requestId: string, audio: ArrayBuffer, response: textToSpeech.SynthesisResponse) {
|
|
|
- console.info(`onData, requestId: ${requestId} sequence: ${JSON.stringify(response)} audio: ${JSON.stringify(audio)}`);
|
|
|
- },
|
|
|
- // 错误回调,播报过程发生错误时触发此回调
|
|
|
- onError(requestId: string, errorCode: number, errorMessage: string) {
|
|
|
- console.error(`onError, requestId: ${requestId} errorCode: ${errorCode} errorMessage: ${errorMessage}`);
|
|
|
+ Row(){
|
|
|
+ Image($r('app.media.icon_del'))
|
|
|
+ .width(25)
|
|
|
+ .aspectRatio(1)
|
|
|
}
|
|
|
- };
|
|
|
- // 设置回调
|
|
|
- ttsEngine.setListener(speakListener);
|
|
|
- // 设置播报相关参数
|
|
|
- let extraParam: Record<string, Object> = {
|
|
|
- "queueMode": 0,
|
|
|
- "speed": 1,
|
|
|
- "volume": 2,
|
|
|
- "pitch": 1,
|
|
|
- "languageContext": 'zh-CN',
|
|
|
- "audioType": "pcm",
|
|
|
- "soundChannel": 3,
|
|
|
- "playType": 1
|
|
|
+ .backgroundColor('#FF3B30')
|
|
|
+ .alignItems(VerticalAlign.Center)
|
|
|
+ .justifyContent(FlexAlign.Center)
|
|
|
+ .borderRadius({topRight: 15, bottomRight: 15})
|
|
|
+ .padding({ left: 18, top: 30, right: 18, bottom: 30 })
|
|
|
+ .onClick(() => { this.vm._onDeleteSeatTable() })
|
|
|
}
|
|
|
- let speakParams: textToSpeech.SpeakParams = {
|
|
|
- requestId: '123456-a', // requestId在同一实例内仅能用一次,请勿重复设置
|
|
|
- extraParams: extraParam
|
|
|
- };
|
|
|
- // 调用speak播报方法
|
|
|
- ttsEngine.speak(this.originalText, speakParams);
|
|
|
- };
|
|
|
+ .borderRadius({topRight: 15, bottomRight: 15})
|
|
|
+ }
|
|
|
|
|
|
- // 查询语种音色信息,以callback形式返回
|
|
|
- private listVoicesCallback() {
|
|
|
- // 设置查询相关参数
|
|
|
- let voicesQuery: textToSpeech.VoiceQuery = {
|
|
|
- requestId: '123456-b', // requestId在同一实例内仅能用一次,请勿重复设置
|
|
|
- online: 1
|
|
|
- };
|
|
|
- // 调用listVoices方法,以callback返回语种音色查询结果
|
|
|
- ttsEngine.listVoices(voicesQuery, (err: BusinessError, voiceInfo: textToSpeech.VoiceInfo[]) => {
|
|
|
- if (!err) {
|
|
|
- // 接收目前支持的语种音色等信息
|
|
|
- this.voiceInfo = JSON.stringify(voiceInfo);
|
|
|
- console.info(`Succeeded in listing voices, voiceInfo is ${voiceInfo}`);
|
|
|
- } else {
|
|
|
- console.error(`Failed to list voices. Code: ${err.code}, message: ${err.message}`);
|
|
|
- }
|
|
|
- });
|
|
|
- };
|
|
|
}
|