更新时间:2026-02-03 GMT+08:00
分享

Websocket握手请求

功能介绍

本接口提供实时流式合成。用户建立连接、发送开始消息、发送合成文本消息、发送结束消息、断开连接。其中合成文本消息支持多次发送,可用于大模型输出实时播报等场景。

注意事项

  • 同一个会话中,单次合成不超过300字符,总计不超过10万字符,其中汉字、英文字母、标点或空格均算作字符。
  • 服务侧收到流式合成文本后缓存,并按照句子分割后合成。文本合成依赖句子的完整性,确保合成文本包含正确标点(尤其是文本末尾标点),否则文本可能长时间缓存而未合成。
  • 会话中如果出现错误或严重的错误,系统会舍弃待合成的文本,只计费已合成的文本。

工作流程

从流程图可以看出,一次完整的流程为:建立连接、发送消息(开始)、发送消息(文本)、发送消息(结束)、断开连接。

URI

wss /v1/{project_id}/vcs/voices/clone

表1 参数说明

名称

是否必选

说明

project_id

项目编号。获取方法,请参见获取项目ID

  • 请求示例(伪码)
    wss://{endpoint}/v1/{project_id}/vcs/voices/clone
    
    Request Header:
    X-Auth-Token: MIINRwYJKoZIhvcNAQcCoIINODCCDTQCAQExDTALBglghkgBZQMEAgEwgguVBgkqhkiG...
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.Response;
    import okhttp3.WebSocket;
    import okhttp3.WebSocketListener;
    import okio.ByteString;
    
    /**
     * 此demo仅供测试使用, 强烈建议使用sdk
     * 使用前需已配置okhttp、okio jar包。jar包可通过下载SDK获取。
     */
    public class VcsDemo {
      public void vcsDemo() {
        try {
          // endpoint和projectId需要替换成实际信息。
          String url = "wss://{{endpoint}}/v1/{{project_id}}/vcs/voices/clone";
          String token = "对应region的token";
          OkHttpClient okHttpClient = new OkHttpClient();
          Request request = new Request.Builder().url(url).header("X-Auth-Token", token).build();
          WebSocket webSocket = okHttpClient.newWebSocket(request, new MyListener());
          // ONLY模式
          String text = "欢迎使用华为云语音合成服务。";
          webSocket.send("{\"command\":\"START\",\"text\":\"" + text + "\", \"text_pieces\": \"ONLY\", \"config\":{\"audio_format\":\"pcm\",\"sample_rate\":\"16000\",\"voice_name\":\"chinese_huaxiaotian_common\"}}");
          // MULTI模式,支持多次发送文本
          // 开始
          // webSocket.send("{\"command\":\"START\",\"config\":{\"audio_format\":\"pcm\",\"sample_rate\":\"16000\",\"voice_name\":\"chinese_huaxiaotian_common\"}}");
          // 合成
          // String text = "欢迎使用华为云语音合成服务。";
          // webSocket.send("{\"command\":\"MSG\", \"text\":\"" + text + "\"}");
          // webSocket.send("{\"command\":\"MSG\", \"text\":\"" + text + "\"}");
          // 结束
          // webSocket.send("{\"command\": \"END\"}");
          Thread.sleep(10000);
          webSocket.close(1000, null);
    
        } catch (Exception e) {
          e.printStackTrace();
        }
    
      }
    
      class MyListener extends WebSocketListener {
        @Override
    
        public void onOpen(WebSocket webSocket, Response response) {
          System.out.println("connected");
        }
    
        @Override
        public void onClosed(WebSocket webSocket, int code, String reason) {
          System.out.println("closed");
        }
    
        @Override
        public void onFailure(WebSocket webSocket, Throwable t, Response response) {
          t.printStackTrace();
        }
    
        @Override
        public void onMessage(WebSocket webSocket, String text) {
          System.out.println(text);
        }
    
        public void onMessage(WebSocket webSocket, ByteString bytes) {
          byte[] data = bytes.toByteArray();
          System.out.println("receive data length is " + data.length);
        }
    
      }
    
      public static void main(String[] args) {
        VcsDemo vcsDemo = new VcsDemo();
        vcsDemo.vcsDemo();
      }
    }
    

相关文档