From 4376afabe5064355c88dfb9a1a2600f08f2eb7f6 Mon Sep 17 00:00:00 2001 From: gitee Date: Mon, 21 Jul 2025 20:33:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0tts=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DigitalHumanController.java | 10 +++++ .../com/supervision/service/TTsService.java | 6 +++ .../service/impl/TTsServiceImpl.java | 38 +++++++++++++++++++ src/main/resources/application.yml | 3 ++ .../supervision/PlatformApplicationTest.java | 16 ++++++++ 5 files changed, 73 insertions(+) create mode 100644 src/main/java/com/supervision/service/TTsService.java create mode 100644 src/main/java/com/supervision/service/impl/TTsServiceImpl.java diff --git a/src/main/java/com/supervision/controller/DigitalHumanController.java b/src/main/java/com/supervision/controller/DigitalHumanController.java index 0e8e855..f6f6e35 100644 --- a/src/main/java/com/supervision/controller/DigitalHumanController.java +++ b/src/main/java/com/supervision/controller/DigitalHumanController.java @@ -5,9 +5,12 @@ import com.supervision.domain.LivetalkingChatDTO; import com.supervision.dto.DigitalHumanDTO; import com.supervision.dto.DigitalHumanVoiceDTO; import com.supervision.dto.R; +import com.supervision.service.TTsService; import com.supervision.service.danmaku.DigitalHumanManageService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; /** * 数字人控制器 @@ -19,6 +22,8 @@ public class DigitalHumanController { private final DigitalHumanManageService digitalHumanManageService; + private final TTsService tTsService; + /** * 分页查询数字人列表 * @param page 当前页码 @@ -49,4 +54,9 @@ public class DigitalHumanController { digitalHumanManageService.chatCallBack(digitalHumanVoiceDTO); return R.ok(); } + @PostMapping("/livetalking/asr") + public R tts(@RequestPart("file") MultipartFile file) throws IOException { + String stt = tTsService.stt(file.getOriginalFilename(), file.getBytes()); + return R.ok(stt); + } } diff --git a/src/main/java/com/supervision/service/TTsService.java b/src/main/java/com/supervision/service/TTsService.java new file mode 100644 index 0000000..e10a419 --- /dev/null +++ b/src/main/java/com/supervision/service/TTsService.java @@ -0,0 +1,6 @@ +package com.supervision.service; + +public interface TTsService { + + String stt(String model,byte[] audioData); +} diff --git a/src/main/java/com/supervision/service/impl/TTsServiceImpl.java b/src/main/java/com/supervision/service/impl/TTsServiceImpl.java new file mode 100644 index 0000000..2cb557d --- /dev/null +++ b/src/main/java/com/supervision/service/impl/TTsServiceImpl.java @@ -0,0 +1,38 @@ +package com.supervision.service.impl; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.supervision.service.TTsService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class TTsServiceImpl implements TTsService { + + + @Value("${livetalking.tts.url}") + private String ttsUrl; + @Value("${livetalking.tts.model}") + private String model; + @Override + public String stt(String fileName, byte[] audioData) { + String url = ttsUrl + "/v1/audio/transcriptions"; + + HttpRequest post = HttpUtil.createPost(url); + post.form("model", model); + post.form("file", audioData, fileName); + + try (var response = post.execute()) { + if (response.isOk()) { + String body = response.body(); + JSONObject entries = JSONUtil.parseObj(body); + return entries.getStr("text"); + } + throw new RuntimeException("STT request failed: " + response.getStatus() + " - " + response.body()); + } + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 799e45f..44e841b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -43,6 +43,9 @@ livetalking: url: http://192.168.10.96:8010 session: id: 0 + tts: + url: http://192.168.10.96:9997 + model: whisper-large-v3 jwt: secret: "DlHaPUePiN6MyvpMpsMq/t6swzMHqtrRFd2YnofKz4k=" # JWT密钥 使用官方推荐方式生成 Base64.getEncoder().encodeToString(Keys.secretKeyFor(SignatureAlgorithm.HS256).getEncoded()); expiration: 86400000 # 1小时:3600000 1天:86400000 \ No newline at end of file diff --git a/src/test/java/com/supervision/PlatformApplicationTest.java b/src/test/java/com/supervision/PlatformApplicationTest.java index d0d472d..c3ca9a2 100644 --- a/src/test/java/com/supervision/PlatformApplicationTest.java +++ b/src/test/java/com/supervision/PlatformApplicationTest.java @@ -1,13 +1,18 @@ package com.supervision; +import cn.hutool.core.io.FileUtil; import com.hankcs.hanlp.seg.common.Term; import com.hankcs.hanlp.tokenizer.StandardTokenizer; import com.supervision.domain.SysByteArray; import com.supervision.service.SysByteArrayService; +import com.supervision.service.TTsService; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; @Slf4j @SpringBootTest @@ -36,6 +41,17 @@ public class PlatformApplicationTest { boolean isQuestion = isQuestion(sentence); System.out.println("是否是问句: " + isQuestion); } + + @Autowired + private TTsService tTsService; + @Test + public void ttsTest() throws IOException { + File file = FileUtil.file("C:\\Users\\Administrator\\Desktop\\doubao-man.wav_0000181120_0000313600.wav"); + FileInputStream inputStream = new FileInputStream(file); + byte[] bytes = inputStream.readAllBytes(); + String stt = tTsService.stt("doubao-man.wav_0000181120_0000313600.wav", bytes); + System.out.println(stt); + } private boolean isQuestion(String sentence) { String[] questionWords = {"什么", "为什么", "如何", "哪", "谁", "多少", "是否", "能否", "是不是"}; String[] questionEndings = {"吗", "呢", "?", "?"};