From e9d2cfc3a134b00f4e98271fbee3838d1ccecbcc Mon Sep 17 00:00:00 2001
From: VirtuosoQ <2416050435@qq.com>
Date: 星期五, 26 四月 2024 14:59:30 +0800
Subject: [PATCH] FunASR java http  client

---
 runtime/java/http/src/main/java/com/example/funasr_java_client/FunasrJavaClientApplication.java            |   13 +
 runtime/java/http/src/test/java/com/example/funasr_java_client/FunasrJavaClientApplicationTests.java       |   13 +
 runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/RecognitionService2.java          |   18 ++
 runtime/java/http/src/Readme.md                                                                            |    6 
 runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/RecognitionController.java        |   36 +++++
 runtime/java/http/src/main/java/com/example/funasr_java_client/WebSocketClient.java                        |   63 +++++++++
 runtime/java/http/src/main/java/com/example/funasr_java_client/RecognitionController.java                  |   36 +++++
 runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/RecognitionService.java           |   19 ++
 runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/impl/RecognitionServiceImpl.java  |   93 +++++++++++++
 runtime/java/http/src/main/resources/application.properties                                                |    2 
 runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/impl/RecognitionServiceImpl2.java |  105 +++++++++++++++
 11 files changed, 404 insertions(+), 0 deletions(-)

diff --git a/runtime/java/http/src/Readme.md b/runtime/java/http/src/Readme.md
new file mode 100644
index 0000000..ea18551
--- /dev/null
+++ b/runtime/java/http/src/Readme.md
@@ -0,0 +1,6 @@
+dependencies {
+  implementation("org.springframework.boot:spring-boot-starter-web")
+  implementation("org.json:json:20240303")
+  implementation("org.springframework.boot:spring-boot-starter-websocket")
+  testImplementation("org.springframework.boot:spring-boot-starter-test")
+}
\ No newline at end of file
diff --git a/runtime/java/http/src/main/java/com/example/funasr_java_client/FunasrJavaClientApplication.java b/runtime/java/http/src/main/java/com/example/funasr_java_client/FunasrJavaClientApplication.java
new file mode 100644
index 0000000..e60563d
--- /dev/null
+++ b/runtime/java/http/src/main/java/com/example/funasr_java_client/FunasrJavaClientApplication.java
@@ -0,0 +1,13 @@
+package com.example.funasr_java_client;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class FunasrJavaClientApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(FunasrJavaClientApplication.class, args);
+    }
+
+}
diff --git a/runtime/java/http/src/main/java/com/example/funasr_java_client/RecognitionController.java b/runtime/java/http/src/main/java/com/example/funasr_java_client/RecognitionController.java
new file mode 100644
index 0000000..81e4927
--- /dev/null
+++ b/runtime/java/http/src/main/java/com/example/funasr_java_client/RecognitionController.java
@@ -0,0 +1,36 @@
+package com.example.funasr_java_client.Servcvice;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+
+/**
+ *
+ * @author Virtuoso Qiu
+ * @since 2024/04/24
+ *
+ */
+@RestController
+@RequestMapping("/recognition")
+public class RecognitionController {
+
+    private final RecognitionService recognitionService;
+
+    public RecognitionController(RecognitionService recognitionService) {
+        this.recognitionService = recognitionService;
+    }
+    @PostMapping("/testNIO")
+    public String testIO(@RequestParam MultipartFile file) throws IOException, ExecutionException, InterruptedException {
+        recognitionService.recognition(file);
+        return "娴嬭瘯鎴愬姛";
+    }
+
+    @PostMapping("/testIO")
+    public String testNIO(@RequestParam MultipartFile file) throws IOException, ExecutionException, InterruptedException {
+        recognitionService.recognition(file);
+        return "娴嬭瘯鎴愬姛";
+    }
+}
diff --git a/runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/RecognitionController.java b/runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/RecognitionController.java
new file mode 100644
index 0000000..81e4927
--- /dev/null
+++ b/runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/RecognitionController.java
@@ -0,0 +1,36 @@
+package com.example.funasr_java_client.Servcvice;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+
+/**
+ *
+ * @author Virtuoso Qiu
+ * @since 2024/04/24
+ *
+ */
+@RestController
+@RequestMapping("/recognition")
+public class RecognitionController {
+
+    private final RecognitionService recognitionService;
+
+    public RecognitionController(RecognitionService recognitionService) {
+        this.recognitionService = recognitionService;
+    }
+    @PostMapping("/testNIO")
+    public String testIO(@RequestParam MultipartFile file) throws IOException, ExecutionException, InterruptedException {
+        recognitionService.recognition(file);
+        return "娴嬭瘯鎴愬姛";
+    }
+
+    @PostMapping("/testIO")
+    public String testNIO(@RequestParam MultipartFile file) throws IOException, ExecutionException, InterruptedException {
+        recognitionService.recognition(file);
+        return "娴嬭瘯鎴愬姛";
+    }
+}
diff --git a/runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/RecognitionService.java b/runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/RecognitionService.java
new file mode 100644
index 0000000..16558fc
--- /dev/null
+++ b/runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/RecognitionService.java
@@ -0,0 +1,19 @@
+package com.example.funasr_java_client.Servcvice;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+
+
+/**
+ *
+ * @author Virtuoso Qiu
+ * @since 2024/04/24
+ *
+ */
+
+public interface RecognitionService {
+
+    Object recognition(MultipartFile file) throws IOException, ExecutionException, InterruptedException;
+}
diff --git a/runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/RecognitionService2.java b/runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/RecognitionService2.java
new file mode 100644
index 0000000..58805b5
--- /dev/null
+++ b/runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/RecognitionService2.java
@@ -0,0 +1,18 @@
+package com.example.funasr_java_client.Servcvice;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+
+/**
+ *
+ * @author Virtuoso Qiu
+ * @since 2024/04/24
+ *
+ */
+
+public interface RecognitionService2 {
+
+    Object recognition(MultipartFile file) throws IOException, ExecutionException, InterruptedException;
+}
diff --git a/runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/impl/RecognitionServiceImpl.java b/runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/impl/RecognitionServiceImpl.java
new file mode 100644
index 0000000..1aa6c48
--- /dev/null
+++ b/runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/impl/RecognitionServiceImpl.java
@@ -0,0 +1,93 @@
+package com.example.funasr_java_client.Servcvice.impl;
+
+import com.example.funasr_java_client.Servcvice.RecognitionService;
+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.File;
+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 RecognitionServiceImpl implements RecognitionService {
+
+    @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"); // 鏂囦欢鏍煎紡涓簆cm
+        configJson.put("is_speaking", true);
+        configJson.put("hotwords", "{\"鑷畾涔塡":20,\"鐑瘝\":20,\"璁剧疆\":30}");
+        configJson.put("itn", true);
+
+        // 鍙戦�侀厤缃弬鏁颁笌meta淇℃伅
+        webSocketSession.sendMessage(new TextMessage(configJson.toString()));
+
+        byte[] audioData;
+        try {
+            audioData = Files.readAllBytes(Paths.get(localFilePath));
+        } catch (IOException e) {
+            System.err.println("Error reading file: " + e.getMessage());
+            e.printStackTrace();
+            return "Error reading audio file"; // Return an appropriate error message or throw an exception
+        }
+
+        ByteBuffer audioByteBuffer = ByteBuffer.wrap(audioData);
+
+        BinaryMessage binaryMessage = new BinaryMessage(audioByteBuffer);
+        webSocketSession.sendMessage(binaryMessage);
+
+        // 鍙戦�侀煶棰戠粨鏉熸爣蹇�
+        JSONObject endMarkerJson = new JSONObject();
+        endMarkerJson.put("is_speaking", false);
+        webSocketSession.sendMessage(new TextMessage(endMarkerJson.toString()));
+
+        // TODO: 瀹炵幇鎺ユ敹骞跺鐞嗘湇鍔$杩斿洖鐨勮瘑鍒粨鏋�
+
+        return "test";
+
+    }
+}
diff --git a/runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/impl/RecognitionServiceImpl2.java b/runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/impl/RecognitionServiceImpl2.java
new file mode 100644
index 0000000..4748a4e
--- /dev/null
+++ b/runtime/java/http/src/main/java/com/example/funasr_java_client/Servcvice/impl/RecognitionServiceImpl2.java
@@ -0,0 +1,105 @@
+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"); // 鏂囦欢鏍煎紡涓簆cm
+        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);
+            // 浣跨敤鎴栧彂閫乥inaryMessage...
+        } 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";
+
+    }
+}
diff --git a/runtime/java/http/src/main/java/com/example/funasr_java_client/WebSocketClient.java b/runtime/java/http/src/main/java/com/example/funasr_java_client/WebSocketClient.java
new file mode 100644
index 0000000..331b510
--- /dev/null
+++ b/runtime/java/http/src/main/java/com/example/funasr_java_client/WebSocketClient.java
@@ -0,0 +1,63 @@
+package com.example.funasr_java_client;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.*;
+
+
+/**
+ *
+ * @author Virtuoso Qiu
+ * @since 2024/04/24
+ *
+ */
+
+
+@Component
+public class WebSocketClient implements WebSocketHandler {
+
+    private WebSocketSession session;
+
+    @Override
+    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
+        this.session = session;
+        System.out.println("WebSocket connection established.");
+    }
+
+    @Override
+    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
+        if (message instanceof TextMessage) {
+            String receivedMessage = ((TextMessage) message).getPayload();
+            System.out.println("Received message from server: " + receivedMessage);
+            // 鍦ㄨ繖閲屽鐞嗘帴鏀跺埌鐨勬秷鎭�
+        }
+    }
+
+    @Override
+    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
+        System.err.println("WebSocket transport error: " + exception.getMessage());
+        session.close(CloseStatus.SERVER_ERROR);
+    }
+
+    @Override
+    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
+        System.out.println("WebSocket connection closed with status: " + status);
+    }
+
+    @Override
+    public boolean supportsPartialMessages() {
+        return false;
+    }
+
+    public void sendMessage(String message) {
+        if (session != null && session.isOpen()) {
+            try {
+                session.sendMessage(new TextMessage(message));
+                System.out.println("Sent message to server: " + message);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        } else {
+            System.err.println("WebSocket session is not open. Cannot send message.");
+        }
+    }
+}
diff --git a/runtime/java/http/src/main/resources/application.properties b/runtime/java/http/src/main/resources/application.properties
new file mode 100644
index 0000000..b21adeb
--- /dev/null
+++ b/runtime/java/http/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+spring.application.name=funasr_java_client
+server.port=8081
diff --git a/runtime/java/http/src/test/java/com/example/funasr_java_client/FunasrJavaClientApplicationTests.java b/runtime/java/http/src/test/java/com/example/funasr_java_client/FunasrJavaClientApplicationTests.java
new file mode 100644
index 0000000..761713c
--- /dev/null
+++ b/runtime/java/http/src/test/java/com/example/funasr_java_client/FunasrJavaClientApplicationTests.java
@@ -0,0 +1,13 @@
+package com.example.funasr_java_client;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class FunasrJavaClientApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}

--
Gitblit v1.9.1