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