
# Websocket握手请求
#### 功能介绍
本接口提供实时流式合成。用户建立连接、发送开始消息、发送合成文本消息、发送结束消息、断开连接。其中合成文本消息支持多次发送，可用于大模型输出实时播报等场景。
#### 注意事项
- 同一个会话中，单次合成不超过300字符，总计不超过10万字符，其中汉字、英文字母、标点或空格均算作字符。
- 服务侧收到流式合成文本后缓存，并按照句子分割后合成。文本合成依赖句子的完整性，确保合成文本包含正确标点（尤其是文本末尾标点），否则文本可能长时间缓存而未合成。
- 会话中如果出现错误或严重的错误，系统会舍弃待合成的文本，只计费已合成的文本。
 
#### 工作流程
从流程图可以看出，一次完整的流程为：建立连接、发送消息(开始)、发送消息(文本)、发送消息(结束)、断开连接。
![](https://support.huaweicloud.com/api-sis/zh-cn_image_0000002512358107.png)
#### URI
wss /v1/{project_id}/vcs/voices/clone
表1参数说明 
| 名称         | 是否必选 | 说明                                                                               |
|:---|:---|:---|
| project_id | 是    | 项目编号。获取方法，请参见[获取项目ID](https://support.huaweicloud.com/api-sis/sis_03_0008.html)。 |
   
- 请求示例（伪码）
  ```
  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();
    }
  }
  ```
  
  
 
