websocket之语音包测试

本文对比了Java的vad4j和Python的webrtcvad在实时语音包测试中的应用,指出Java的vad4j由于缺少Opus解码器而无法直接使用,而Python的webrtcvad可用且支持Opus解码。前端使用MediaRecorderAPI录制音频并通过WebSocket传输,需要注意采样率和WebSocket接收限制。
摘要由CSDN通过智能技术生成

本文主要是关于实时语音包测试的小记:公司之前搞语音的同学推荐了三个包,如下:

Java:

        vad4j、webrtcvad的俩包

Python:

        webrtcvad的包

1. Java包目前测了下vad4j的包是无法使用的 ,vue通过传输websocket二进制的音频数据来检测

(目前还未测试解压缩后的数据,因为Java包目前还没找到相关Opus的解码器,一般是安卓的)

具体使用方式:

GitHub - orctom/vad4j: VAD for Java  -- demo

<dependency>
  <groupId>com.orctom</groupId>
  <artifactId>vad4j</artifactId>
  <version>1.0</version>
</dependency>
// use built-in threshold
try (VAD vad = new VAD()) {
  boolean isSpeech = vad.isSpeech(pcm);
  LOGGER.info("is speech: {}", isSpeech);
}

// or use threshold of your choise
try (VAD vad = new VAD()) {
  float score = vad.speechProbability(pcm);
  boolean isSpeech = score >= VAD.THRESHOLD;
  LOGGER.info("is speech: {}", isSpeech);
}

而webrtcvad的语音识别包是没有相关依赖~

https://github.com/jitsi/jitsi-webrtc-vad-wrapper

2. python的webrtcvad语音检测包是可以用的 ,而且相关的解码库也是正常可以解码的

前端使用的是MediaRecorder API ,此插件可以通过麦克风录制音频,并发送给websocket消息

mimeType(音频格式)为audio/webm;codecs=opus

表示的音频数据是WebM格式的音频流,使用Opus编码器进行压缩。

ps:这里传输的音频流数据,websocket接收后必须用Opus解码器进行解码音频流,且设置的相关参数如,采样率48000HZ,位深度16,单声道1这些前后端同学都要统一,其中采样率48000HZ是浏览器默认的采样率,如果自行设置了也会被覆盖,望周知~

3. websocket接收音频流的时候有个默认大小限制8000多,如果超过了这个限制是无法接收到音频流数据的,可以设置为300000 30M试试传输。

有问题及时留言,如果Java其他语音包能识别用,希望亲滴我

以下是一个使用 Go 语言将 WebSocket 转发到 Socket 的示例代码: ```go package main import ( "fmt" "log" "net" "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } func main() { // 启动 WebSocket 服务器 http.HandleFunc("/ws", handleWebSocket) go func() { log.Println("WebSocket 服务器启动,监听端口 8080") err := http.ListenAndServe(":8080", nil) if err != nil { log.Fatal("WebSocket 服务器启动失败:", err) } }() // 启动 Socket 服务器 go func() { log.Println("Socket 服务器启动,监听端口 9000") listener, err := net.Listen("tcp", "localhost:9000") if err != nil { log.Fatal("Socket 服务器启动失败:", err) } for { conn, err := listener.Accept() if err != nil { log.Fatal("Socket 连接接受失败:", err) } go handleSocket(conn) } }() select {} } func handleWebSocket(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("WebSocket 连接升级失败:", err) return } log.Println("WebSocket 连接已建立") for { msgType, msg, err := conn.ReadMessage() if err != nil { log.Println("WebSocket 读取消息失败:", err) break } log.Printf("收到 WebSocket 消息:%s\n", msg) // 将消息转发给 Socket err = forwardToSocket(string(msg)) if err != nil { log.Println("Socket 转发失败:", err) break } // 从 Socket 接收响应 resp, err := receiveFromSocket() if err != nil { log.Println("Socket 接收响应失败:", err) break } log.Printf("收到 Socket 响应:%s\n", resp) // 将响应发送给 WebSocket err = conn.WriteMessage(msgType, []byte(resp)) if err != nil { log.Println("WebSocket 发送响应失败:", err) break } } conn.Close() log.Println("WebSocket 连接已关闭") } func handleSocket(conn net.Conn) { defer conn.Close() buf := make([]byte, 1024) for { n, err := conn.Read(buf) if err != nil { log.Println("Socket 读取失败:", err) break } msg := string(buf[:n]) log.Printf("收到 Socket 消息:%s\n", msg) // 将消息转发给 WebSocket err = forwardToWebSocket(msg) if err != nil { log.Println("WebSocket 转发失败:", err) break } } } func forwardToSocket(msg string) error { conn, err := net.Dial("tcp", "localhost:9000") if err != nil { return fmt.Errorf("无法连接到 Socket 服务器:%w", err) } defer conn.Close() _, err = conn.Write([]byte(msg)) if err != nil { return fmt.Errorf("Socket 发送失败:%w", err) } return nil } func receiveFromSocket() (string, error) { conn, err := net.Dial("tcp", "localhost:9000") if err != nil { return "", fmt.Errorf("无法连接到 Socket 服务器:%w", err) } defer conn.Close() buf := make([]byte, 1024) n, err := conn.Read(buf) if err != nil { return "", fmt.Errorf("Socket 接收失败:%w", err) } return string(buf[:n]), nil } func forwardToWebSocket(msg string) error { conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil) if err != nil { return fmt.Errorf("无法连接到 WebSocket 服务器:%w", err) } defer conn.Close() err = conn.WriteMessage(websocket.TextMessage, []byte(msg)) if err != nil { return fmt.Errorf("WebSocket 发送失败:%w", err) } return nil } ``` 这个示例代码中,我们使用 `github.com/gorilla/websocket` 来处理 WebSocket 连接。当有 WebSocket 连接建立后,我们会将收到的消息转发给 Socket 服务器,并从 Socket 服务器接收响应。然后,我们将响应发送回 WebSocket 客户端。 请注意,该示例代码仅用于演示目的,可能需要根据您的实际需求进行修改。确保按照您的实际情况进行适当的配置和错误处理。 希望能对您有所帮助!如果您还有其他问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值