From 013e87f16b6721d6f45212b3920b36b161799b02 Mon Sep 17 00:00:00 2001 From: chenshaohua <635616957@qq.com> Date: Wed, 1 Apr 2026 10:43:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E9=94=80=E4=BA=92=E8=81=94=E7=BD=91?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SpeechRecognitionWebSocketHandler.java | 128 ++++---- .../ruoyi/cms/handler/SpeechRecognizerAI.java | 296 ++++++++--------- .../SpeechSynthesisWebSocketHandler.java | 302 +++++++++--------- 3 files changed, 363 insertions(+), 363 deletions(-) diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/handler/SpeechRecognitionWebSocketHandler.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/handler/SpeechRecognitionWebSocketHandler.java index 75aa02a..b1c15fd 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/handler/SpeechRecognitionWebSocketHandler.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/handler/SpeechRecognitionWebSocketHandler.java @@ -1,64 +1,64 @@ -package com.ruoyi.cms.handler; - -import com.ruoyi.cms.util.AliyunNlsUtils; -import org.springframework.stereotype.Component; - -import javax.websocket.*; -import javax.websocket.server.ServerEndpoint; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.nio.ByteBuffer; - -@Component -@ServerEndpoint("/speech-recognition") -public class SpeechRecognitionWebSocketHandler { - - private SpeechRecognizerAI recognizerDemo; - - public SpeechRecognitionWebSocketHandler() { - // 初始化语音识别器 - String appKey = "4lFYn2yPsQymwGu8"; - String id = "LTAI5t9hhSqdDHqwH3RjgyYj"; - String secret = "ni5aW3vxrWouMwcGqJPfh9Uu56PBuv"; - String url = System.getenv().getOrDefault("NLS_GATEWAY_URL", AliyunNlsUtils.getNlsUrl()+"/ws/v1/"); - recognizerDemo = new SpeechRecognizerAI(appKey, id, secret, url); - } - - /** - * 连接建立成功调用的方法 - */ - @OnOpen - public void onOpen(Session session) { - System.out.println("WebSocket 连接建立成功,sessionId = " + session.getId()); - } - - /** - * 收到客户端消息后调用的方法 - */ - @OnMessage(maxMessageSize=5242880) - public void onMessage(ByteBuffer message, Session session) throws IOException { - byte[] audioData = new byte[message.remaining()]; - message.get(audioData); - - // 处理音频数据 - recognizerDemo.processStream(session, new ByteArrayInputStream(audioData), 16000); - } - - - /** - * 连接关闭调用的方法 - */ - @OnClose - public void onClose(Session session) { - System.out.println("WebSocket 连接关闭,sessionId = " + session.getId()); - } - - /** - * 发生错误时调用的方法 - */ - @OnError - public void onError(Session session, Throwable error) { - System.err.println("WebSocket 发生错误:" + error.getMessage()); - error.printStackTrace(); - } -} \ No newline at end of file +//package com.ruoyi.cms.handler; +// +//import com.ruoyi.cms.util.AliyunNlsUtils; +//import org.springframework.stereotype.Component; +// +//import javax.websocket.*; +//import javax.websocket.server.ServerEndpoint; +//import java.io.ByteArrayInputStream; +//import java.io.IOException; +//import java.nio.ByteBuffer; +// +//@Component +//@ServerEndpoint("/speech-recognition") +//public class SpeechRecognitionWebSocketHandler { +// +// private SpeechRecognizerAI recognizerDemo; +// +// public SpeechRecognitionWebSocketHandler() { +// // 初始化语音识别器 +// String appKey = "4lFYn2yPsQymwGu8"; +// String id = "LTAI5t9hhSqdDHqwH3RjgyYj"; +// String secret = "ni5aW3vxrWouMwcGqJPfh9Uu56PBuv"; +// String url = System.getenv().getOrDefault("NLS_GATEWAY_URL", AliyunNlsUtils.getNlsUrl()+"/ws/v1/"); +// recognizerDemo = new SpeechRecognizerAI(appKey, id, secret, url); +// } +// +// /** +// * 连接建立成功调用的方法 +// */ +// @OnOpen +// public void onOpen(Session session) { +// System.out.println("WebSocket 连接建立成功,sessionId = " + session.getId()); +// } +// +// /** +// * 收到客户端消息后调用的方法 +// */ +// @OnMessage(maxMessageSize=5242880) +// public void onMessage(ByteBuffer message, Session session) throws IOException { +// byte[] audioData = new byte[message.remaining()]; +// message.get(audioData); +// +// // 处理音频数据 +// recognizerDemo.processStream(session, new ByteArrayInputStream(audioData), 16000); +// } +// +// +// /** +// * 连接关闭调用的方法 +// */ +// @OnClose +// public void onClose(Session session) { +// System.out.println("WebSocket 连接关闭,sessionId = " + session.getId()); +// } +// +// /** +// * 发生错误时调用的方法 +// */ +// @OnError +// public void onError(Session session, Throwable error) { +// System.err.println("WebSocket 发生错误:" + error.getMessage()); +// error.printStackTrace(); +// } +//} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/handler/SpeechRecognizerAI.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/handler/SpeechRecognizerAI.java index 3425af2..937c74b 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/handler/SpeechRecognizerAI.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/handler/SpeechRecognizerAI.java @@ -1,148 +1,148 @@ -package com.ruoyi.cms.handler; - -import com.alibaba.nls.client.AccessToken; -import com.alibaba.nls.client.protocol.InputFormatEnum; -import com.alibaba.nls.client.protocol.NlsClient; -import com.alibaba.nls.client.protocol.SampleRateEnum; -import com.alibaba.nls.client.protocol.asr.SpeechRecognizer; -import com.alibaba.nls.client.protocol.asr.SpeechRecognizerListener; -import com.alibaba.nls.client.protocol.asr.SpeechRecognizerResponse; -import com.ruoyi.cms.util.AliyunNlsUtils; -import lombok.Data; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.websocket.Session; -import java.io.IOException; -import java.io.InputStream; -@Data -public class SpeechRecognizerAI { - private static final Logger logger = LoggerFactory.getLogger(SpeechRecognizerAI.class); - private String appKey; - private NlsClient client; - private AccessToken accessToken; - public SpeechRecognizerAI(String appKey, String id, String secret, String url) { - this.appKey = appKey; - - // 获取 AccessToken - accessToken = new AccessToken(id, secret); - try { - if(AliyunNlsUtils.USE_TEST_ENV){ - accessToken.apply(); // 申请 Token - }else{ - AliyunNlsTokenUtil.generateToken(id, secret, this.accessToken); - } - //accessToken.apply(); // 申请 Token - logger.info("Token: {}, Expire Time: {}", accessToken.getToken(), accessToken.getExpireTime()); - - // 初始化 NlsClient - if (url.isEmpty()) { - this.client = new NlsClient(accessToken.getToken()); // 使用默认服务地址 - } else { - this.client = new NlsClient(url, accessToken.getToken()); // 使用自定义服务地址 - } - } catch (Exception e) { - logger.error("Failed to initialize NlsClient: {}", e.getMessage()); - } - } - - public void processStream(Session session, InputStream inputStream, int sampleRate) { - SpeechRecognizer recognizer = null; - try { - // 创建 SpeechRecognizer 实例 - recognizer = new SpeechRecognizer(client, new SpeechRecognizerListener() { - @Override - public void onRecognitionResultChanged(SpeechRecognizerResponse response) { - // 打印中间识别结果 - String text = response.getRecognizedText(); - logger.info("中间识别结果: {}", text); - - sendResult(session, text,false); - } - - @Override - public void onRecognitionCompleted(SpeechRecognizerResponse response) { - // 打印最终识别结果 - String text = response.getRecognizedText(); - logger.info("最终识别结果: {}", text); - sendResult(session, text,true); - } - - @Override - public void onStarted(SpeechRecognizerResponse response) { - logger.info("识别开始, TaskId: {}", response.getTaskId()); - } - - @Override - public void onFail(SpeechRecognizerResponse response) { - logger.error("识别失败: {}", response.getStatusText()); - } - }); - - // 设置语音识别参数 - recognizer.setAppKey(appKey); - recognizer.setFormat(InputFormatEnum.PCM); - recognizer.setSampleRate(sampleRate == 16000 ? - SampleRateEnum.SAMPLE_RATE_16K : SampleRateEnum.SAMPLE_RATE_8K); - recognizer.setEnableIntermediateResult(true); - recognizer.addCustomedParam("enable_voice_detection", true); - - // 启动识别 - recognizer.start(); - - // 读取音频流并发送 - byte[] buffer = new byte[3200]; - int len; - while ((len = inputStream.read(buffer)) > 0) { - recognizer.send(buffer, len); - } - - // 停止识别 - recognizer.stop(); - } catch (Exception e) { - logger.error("处理音频流时出错: {}", e.getMessage()); - } finally { - if (recognizer != null) { - recognizer.close(); - } - } - } - - private void sendResult(Session session, String text,Boolean asrEnd) { - try { - session.getBasicRemote().sendText("{\"text\": \"" + text + "\",\"asrEnd\":\"" + asrEnd + "\"}"); - } catch (IOException e) { - logger.error("发送识别结果失败: {}", e.getMessage()); - } - } - - public void shutdown() { - if (client != null) { - client.shutdown(); - } - } - /** - * 获取当前有效的 AccessToken - * - * @param id 阿里云 AccessKey ID - * @param secret 阿里云 AccessKey Secret - * @return 返回申请到的 AccessToken 字符串,失败时返回 null - */ - public static String getAccessToken(String id, String secret) { - try { - AccessToken accessToken = new AccessToken(id, secret); - accessToken.apply(); // 申请 token - - if (accessToken.getToken() != null) { - logger.info("成功获取 Token: {}, 过期时间: {}", accessToken.getToken(), accessToken.getExpireTime()); - return accessToken.getToken(); - } else { - logger.error("get token fail:"+accessToken.getToken()); - return null; - } - } catch (IOException e) { - logger.error("申请 Token 时发生网络错误: {}", e.getMessage()); - return null; - } - } -} \ No newline at end of file +//package com.ruoyi.cms.handler; +// +//import com.alibaba.nls.client.AccessToken; +//import com.alibaba.nls.client.protocol.InputFormatEnum; +//import com.alibaba.nls.client.protocol.NlsClient; +//import com.alibaba.nls.client.protocol.SampleRateEnum; +//import com.alibaba.nls.client.protocol.asr.SpeechRecognizer; +//import com.alibaba.nls.client.protocol.asr.SpeechRecognizerListener; +//import com.alibaba.nls.client.protocol.asr.SpeechRecognizerResponse; +//import com.ruoyi.cms.util.AliyunNlsUtils; +//import lombok.Data; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +//import javax.websocket.Session; +//import java.io.IOException; +//import java.io.InputStream; +//@Data +//public class SpeechRecognizerAI { +// private static final Logger logger = LoggerFactory.getLogger(SpeechRecognizerAI.class); +// private String appKey; +// private NlsClient client; +// private AccessToken accessToken; +// public SpeechRecognizerAI(String appKey, String id, String secret, String url) { +// this.appKey = appKey; +// +// // 获取 AccessToken +// accessToken = new AccessToken(id, secret); +// try { +// if(AliyunNlsUtils.USE_TEST_ENV){ +// accessToken.apply(); // 申请 Token +// }else{ +// AliyunNlsTokenUtil.generateToken(id, secret, this.accessToken); +// } +// //accessToken.apply(); // 申请 Token +// logger.info("Token: {}, Expire Time: {}", accessToken.getToken(), accessToken.getExpireTime()); +// +// // 初始化 NlsClient +// if (url.isEmpty()) { +// this.client = new NlsClient(accessToken.getToken()); // 使用默认服务地址 +// } else { +// this.client = new NlsClient(url, accessToken.getToken()); // 使用自定义服务地址 +// } +// } catch (Exception e) { +// logger.error("Failed to initialize NlsClient: {}", e.getMessage()); +// } +// } +// +// public void processStream(Session session, InputStream inputStream, int sampleRate) { +// SpeechRecognizer recognizer = null; +// try { +// // 创建 SpeechRecognizer 实例 +// recognizer = new SpeechRecognizer(client, new SpeechRecognizerListener() { +// @Override +// public void onRecognitionResultChanged(SpeechRecognizerResponse response) { +// // 打印中间识别结果 +// String text = response.getRecognizedText(); +// logger.info("中间识别结果: {}", text); +// +// sendResult(session, text,false); +// } +// +// @Override +// public void onRecognitionCompleted(SpeechRecognizerResponse response) { +// // 打印最终识别结果 +// String text = response.getRecognizedText(); +// logger.info("最终识别结果: {}", text); +// sendResult(session, text,true); +// } +// +// @Override +// public void onStarted(SpeechRecognizerResponse response) { +// logger.info("识别开始, TaskId: {}", response.getTaskId()); +// } +// +// @Override +// public void onFail(SpeechRecognizerResponse response) { +// logger.error("识别失败: {}", response.getStatusText()); +// } +// }); +// +// // 设置语音识别参数 +// recognizer.setAppKey(appKey); +// recognizer.setFormat(InputFormatEnum.PCM); +// recognizer.setSampleRate(sampleRate == 16000 ? +// SampleRateEnum.SAMPLE_RATE_16K : SampleRateEnum.SAMPLE_RATE_8K); +// recognizer.setEnableIntermediateResult(true); +// recognizer.addCustomedParam("enable_voice_detection", true); +// +// // 启动识别 +// recognizer.start(); +// +// // 读取音频流并发送 +// byte[] buffer = new byte[3200]; +// int len; +// while ((len = inputStream.read(buffer)) > 0) { +// recognizer.send(buffer, len); +// } +// +// // 停止识别 +// recognizer.stop(); +// } catch (Exception e) { +// logger.error("处理音频流时出错: {}", e.getMessage()); +// } finally { +// if (recognizer != null) { +// recognizer.close(); +// } +// } +// } +// +// private void sendResult(Session session, String text,Boolean asrEnd) { +// try { +// session.getBasicRemote().sendText("{\"text\": \"" + text + "\",\"asrEnd\":\"" + asrEnd + "\"}"); +// } catch (IOException e) { +// logger.error("发送识别结果失败: {}", e.getMessage()); +// } +// } +// +// public void shutdown() { +// if (client != null) { +// client.shutdown(); +// } +// } +// /** +// * 获取当前有效的 AccessToken +// * +// * @param id 阿里云 AccessKey ID +// * @param secret 阿里云 AccessKey Secret +// * @return 返回申请到的 AccessToken 字符串,失败时返回 null +// */ +// public static String getAccessToken(String id, String secret) { +// try { +// AccessToken accessToken = new AccessToken(id, secret); +// accessToken.apply(); // 申请 token +// +// if (accessToken.getToken() != null) { +// logger.info("成功获取 Token: {}, 过期时间: {}", accessToken.getToken(), accessToken.getExpireTime()); +// return accessToken.getToken(); +// } else { +// logger.error("get token fail:"+accessToken.getToken()); +// return null; +// } +// } catch (IOException e) { +// logger.error("申请 Token 时发生网络错误: {}", e.getMessage()); +// return null; +// } +// } +//} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/handler/SpeechSynthesisWebSocketHandler.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/handler/SpeechSynthesisWebSocketHandler.java index 7aa3c52..87a3b13 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/handler/SpeechSynthesisWebSocketHandler.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/handler/SpeechSynthesisWebSocketHandler.java @@ -1,151 +1,151 @@ -package com.ruoyi.cms.handler; - -import com.alibaba.nls.client.AccessToken; -import com.alibaba.nls.client.protocol.NlsClient; -import com.alibaba.nls.client.protocol.OutputFormatEnum; -import com.alibaba.nls.client.protocol.SampleRateEnum; -import com.alibaba.nls.client.protocol.tts.SpeechSynthesizer; -import com.alibaba.nls.client.protocol.tts.SpeechSynthesizerListener; -import com.alibaba.nls.client.protocol.tts.SpeechSynthesizerResponse; -import com.ruoyi.cms.util.AliyunNlsUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import javax.websocket.*; -import javax.websocket.server.ServerEndpoint; -import java.io.IOException; -import java.nio.ByteBuffer; - -@Component -@ServerEndpoint("/speech-synthesis") -public class SpeechSynthesisWebSocketHandler { - private static final Logger logger = LoggerFactory.getLogger(SpeechSynthesisWebSocketHandler.class); - - private NlsClient client; - private String appKey = "mtA2pwmvCeefHT3Y"; - private String accessKeyId = "LTAI5tRBahK93vPNF1JDVEPA"; - private String accessKeySecret = "x95OWb4cV6ccQVtbEJ2Gxm2Uwl2thJ"; - private String url = AliyunNlsUtils.getNlsUrl()+"/ws/v1/"; - - public SpeechSynthesisWebSocketHandler() { - // Initialize NLS client with token - AccessToken accessToken = new AccessToken(accessKeyId, accessKeySecret); - try { - if(AliyunNlsUtils.USE_TEST_ENV){ - accessToken.apply(); - }else{ - AliyunNlsTokenUtil.generateToken(accessKeyId, accessKeySecret, accessToken); - } - //accessToken.apply(); - String token = accessToken.getToken(); - if(url.isEmpty()) { - this.client = new NlsClient(token); - } else { - this.client = new NlsClient(url, token); - } - } catch (Exception e) { - logger.error("Failed to initialize NLS client", e); - } - } - - @OnOpen - public void onOpen(Session session) { - logger.info("WebSocket connected for speech synthesis, sessionId: {}", session.getId()); - } - - @OnMessage(maxMessageSize=5242880) - public void onMessage(String text, Session session) { - logger.info("Received text for synthesis: {}", text); - - SpeechSynthesizer synthesizer = null; - try { - // Create synthesizer with a session-specific listener - synthesizer = new SpeechSynthesizer(client, createSynthesizerListener(session)); - - // Configure synthesizer - synthesizer.setAppKey(appKey); - synthesizer.setFormat(OutputFormatEnum.WAV); - synthesizer.setSampleRate(SampleRateEnum.SAMPLE_RATE_16K); - synthesizer.setVoice("aiqi"); - synthesizer.setPitchRate(0); - synthesizer.setSpeechRate(0); - - // Use long text synthesis - synthesizer.setLongText(text); - - // Start synthesis - synthesizer.start(); - - } catch (Exception e) { - logger.error("Error during speech synthesis", e); - try { - session.close(new CloseReason(CloseReason.CloseCodes.UNEXPECTED_CONDITION, "Synthesis error")); - } catch (IOException ioException) { - logger.error("Error closing session", ioException); - } - } finally { - // Note: We can't close the synthesizer here because synthesis is async - // It should be closed in the listener's onComplete/onFail methods - } - } - - @OnClose - public void onClose(Session session) { - logger.info("WebSocket closed for speech synthesis, sessionId: {}", session.getId()); - } - - @OnError - public void onError(Session session, Throwable error) { - logger.error("WebSocket error for session {}: {}", session.getId(), error.getMessage(), error); - } - - private SpeechSynthesizerListener createSynthesizerListener(Session session) { - return new SpeechSynthesizerListener() { - private boolean firstRecvBinary = true; - private long startTime; - - @Override - public void onComplete(SpeechSynthesizerResponse response) { - logger.info("Synthesis completed for session {}, status: {}", session.getId(), response.getStatus()); - try { - // Send a close message or marker to indicate completion - session.getBasicRemote().sendText("{\"status\":\"complete\"}"); - } catch (IOException e) { - logger.error("Error sending completion message", e); - } - } - - @Override - public void onMessage(ByteBuffer message) { - try { - if (firstRecvBinary) { - firstRecvBinary = false; - startTime = System.currentTimeMillis(); - logger.info("First audio packet received for session {}", session.getId()); - } - - // Send audio data to client - byte[] bytesArray = new byte[message.remaining()]; - message.get(bytesArray, 0, bytesArray.length); - session.getBasicRemote().sendBinary(ByteBuffer.wrap(bytesArray)); - - } catch (IOException e) { - logger.error("Error sending audio data to client", e); - } - } - - @Override - public void onFail(SpeechSynthesizerResponse response) { - logger.error("Synthesis failed for session {}: task_id: {}, status: {}, status_text: {}", - session.getId(), response.getTaskId(), response.getStatus(), response.getStatusText()); - try { - session.close(new CloseReason(CloseReason.CloseCodes.UNEXPECTED_CONDITION, - "Synthesis failed: " + response.getStatusText())); - } catch (IOException e) { - logger.error("Error closing failed session", e); - } - } - }; - } -} \ No newline at end of file +//package com.ruoyi.cms.handler; +// +//import com.alibaba.nls.client.AccessToken; +//import com.alibaba.nls.client.protocol.NlsClient; +//import com.alibaba.nls.client.protocol.OutputFormatEnum; +//import com.alibaba.nls.client.protocol.SampleRateEnum; +//import com.alibaba.nls.client.protocol.tts.SpeechSynthesizer; +//import com.alibaba.nls.client.protocol.tts.SpeechSynthesizerListener; +//import com.alibaba.nls.client.protocol.tts.SpeechSynthesizerResponse; +//import com.ruoyi.cms.util.AliyunNlsUtils; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.stereotype.Component; +// +//import javax.websocket.*; +//import javax.websocket.server.ServerEndpoint; +//import java.io.IOException; +//import java.nio.ByteBuffer; +// +//@Component +//@ServerEndpoint("/speech-synthesis") +//public class SpeechSynthesisWebSocketHandler { +// private static final Logger logger = LoggerFactory.getLogger(SpeechSynthesisWebSocketHandler.class); +// +// private NlsClient client; +// private String appKey = "mtA2pwmvCeefHT3Y"; +// private String accessKeyId = "LTAI5tRBahK93vPNF1JDVEPA"; +// private String accessKeySecret = "x95OWb4cV6ccQVtbEJ2Gxm2Uwl2thJ"; +// private String url = AliyunNlsUtils.getNlsUrl()+"/ws/v1/"; +// +// public SpeechSynthesisWebSocketHandler() { +// // Initialize NLS client with token +// AccessToken accessToken = new AccessToken(accessKeyId, accessKeySecret); +// try { +// if(AliyunNlsUtils.USE_TEST_ENV){ +// accessToken.apply(); +// }else{ +// AliyunNlsTokenUtil.generateToken(accessKeyId, accessKeySecret, accessToken); +// } +// //accessToken.apply(); +// String token = accessToken.getToken(); +// if(url.isEmpty()) { +// this.client = new NlsClient(token); +// } else { +// this.client = new NlsClient(url, token); +// } +// } catch (Exception e) { +// logger.error("Failed to initialize NLS client", e); +// } +// } +// +// @OnOpen +// public void onOpen(Session session) { +// logger.info("WebSocket connected for speech synthesis, sessionId: {}", session.getId()); +// } +// +// @OnMessage(maxMessageSize=5242880) +// public void onMessage(String text, Session session) { +// logger.info("Received text for synthesis: {}", text); +// +// SpeechSynthesizer synthesizer = null; +// try { +// // Create synthesizer with a session-specific listener +// synthesizer = new SpeechSynthesizer(client, createSynthesizerListener(session)); +// +// // Configure synthesizer +// synthesizer.setAppKey(appKey); +// synthesizer.setFormat(OutputFormatEnum.WAV); +// synthesizer.setSampleRate(SampleRateEnum.SAMPLE_RATE_16K); +// synthesizer.setVoice("aiqi"); +// synthesizer.setPitchRate(0); +// synthesizer.setSpeechRate(0); +// +// // Use long text synthesis +// synthesizer.setLongText(text); +// +// // Start synthesis +// synthesizer.start(); +// +// } catch (Exception e) { +// logger.error("Error during speech synthesis", e); +// try { +// session.close(new CloseReason(CloseReason.CloseCodes.UNEXPECTED_CONDITION, "Synthesis error")); +// } catch (IOException ioException) { +// logger.error("Error closing session", ioException); +// } +// } finally { +// // Note: We can't close the synthesizer here because synthesis is async +// // It should be closed in the listener's onComplete/onFail methods +// } +// } +// +// @OnClose +// public void onClose(Session session) { +// logger.info("WebSocket closed for speech synthesis, sessionId: {}", session.getId()); +// } +// +// @OnError +// public void onError(Session session, Throwable error) { +// logger.error("WebSocket error for session {}: {}", session.getId(), error.getMessage(), error); +// } +// +// private SpeechSynthesizerListener createSynthesizerListener(Session session) { +// return new SpeechSynthesizerListener() { +// private boolean firstRecvBinary = true; +// private long startTime; +// +// @Override +// public void onComplete(SpeechSynthesizerResponse response) { +// logger.info("Synthesis completed for session {}, status: {}", session.getId(), response.getStatus()); +// try { +// // Send a close message or marker to indicate completion +// session.getBasicRemote().sendText("{\"status\":\"complete\"}"); +// } catch (IOException e) { +// logger.error("Error sending completion message", e); +// } +// } +// +// @Override +// public void onMessage(ByteBuffer message) { +// try { +// if (firstRecvBinary) { +// firstRecvBinary = false; +// startTime = System.currentTimeMillis(); +// logger.info("First audio packet received for session {}", session.getId()); +// } +// +// // Send audio data to client +// byte[] bytesArray = new byte[message.remaining()]; +// message.get(bytesArray, 0, bytesArray.length); +// session.getBasicRemote().sendBinary(ByteBuffer.wrap(bytesArray)); +// +// } catch (IOException e) { +// logger.error("Error sending audio data to client", e); +// } +// } +// +// @Override +// public void onFail(SpeechSynthesizerResponse response) { +// logger.error("Synthesis failed for session {}: task_id: {}, status: {}, status_text: {}", +// session.getId(), response.getTaskId(), response.getStatus(), response.getStatusText()); +// try { +// session.close(new CloseReason(CloseReason.CloseCodes.UNEXPECTED_CONDITION, +// "Synthesis failed: " + response.getStatusText())); +// } catch (IOException e) { +// logger.error("Error closing failed session", e); +// } +// } +// }; +// } +//} \ No newline at end of file