package com.example.funasr_java_client.Servcvice.impl; import com.example.funasr_java_client.Servcvice.RecognitionService; import com.example.funasr_java_client.Servcvice.RecognitionService2; import com.example.funasr_java_client.WebSocketClient; import org.json.JSONObject; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.socket.BinaryMessage; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.client.standard.StandardWebSocketClient; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URI; import java.nio.ByteBuffer; import java.nio.file.Files; import java.nio.file.Paths; import java.util.concurrent.ExecutionException; /** * * @author Virtuoso Qiu * @since 2024/04/24 * */ @Service public class RecognitionServiceImpl2 implements RecognitionService2 { @Override public Object recognition(MultipartFile file) throws IOException, ExecutionException, InterruptedException { if (file.isEmpty()) { return "0"; // 文件为空,返回特殊值 } String originalFilename = file.getOriginalFilename(); String[] parts = originalFilename.split("\\."); String prefix = (parts.length > 0) ? parts[0] : originalFilename; System.out.println(prefix); String localFilePath = "E:/EI/Audio" + prefix + ".pcm"; File localFile = new File(localFilePath); File destDir = localFile.getParentFile(); if (!destDir.exists() && !destDir.mkdirs()) { throw new IOException("Unable to create destination directory: " + localFilePath); } file.transferTo(localFile); WebSocketClient client = new WebSocketClient(); URI uri = URI.create("ws://182.40.192.72:10095"); StandardWebSocketClient standardWebSocketClient = new StandardWebSocketClient(); WebSocketSession webSocketSession = standardWebSocketClient.execute(client, null, uri).get(); JSONObject configJson = new JSONObject(); configJson.put("mode", "offline"); configJson.put("wav_name", prefix); configJson.put("wav_format", "pcm"); // 文件格式为pcm configJson.put("is_speaking", true); configJson.put("hotwords", "{\"自定义\":20,\"热词\":20,\"设置\":30}"); configJson.put("itn", true); // 发送配置参数与meta信息 webSocketSession.sendMessage(new TextMessage(configJson.toString())); try (FileInputStream fis = new FileInputStream(localFilePath)) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fis.read(buffer)) != -1) { baos.write(buffer, 0, bytesRead); } // 将所有读取的字节合并到一个字节数组中 byte[] completeData = baos.toByteArray(); // 使用字节数组创建BinaryMessage实例 BinaryMessage binaryMessage = new BinaryMessage(completeData); webSocketSession.sendMessage(binaryMessage); // 使用或发送binaryMessage... } catch (IOException e) { System.err.println("Error reading file: " + e.getMessage()); e.printStackTrace(); } // 发送音频结束标志 JSONObject endMarkerJson = new JSONObject(); endMarkerJson.put("is_speaking", false); webSocketSession.sendMessage(new TextMessage(endMarkerJson.toString())); // TODO: 实现接收并处理服务端返回的识别结果 return "test"; } }