
# Websocket握手请求
#### 功能介绍
本接口提供实时流式语音合成。用户每次建立连接，发送待合成文本，服务端将合成结果响应给用户。一次连接只能发送一次文本，如果有多段文本需要合成，需要多次建立连接。实时语音合成和语音合成均属于语音合成接口，采用完全相同的计费规则，两者价格梯度可互相叠加，可参考[价格计算器](https://www.huaweicloud.com/pricing.html?tab=calculator#/sis)。
#### 工作流程
从流程图可以看出，实时语音合成只需要发送1次开始请求，会陆续收到开始响应、合成音频的分片响应、结束响应。
![](https://support.huaweicloud.com/api-sis/zh-cn_image_0000001293377077.png)
#### 授权信息
账号具备所有API的调用权限，如果使用账号下的IAM用户调用当前API，该IAM用户需具备调用API所需的权限，具体权限要求请参见[权限和授权项](https://support.huaweicloud.com/usermanual-sis/sis_09_0016.html)。
#### wss-URI
- wss-URI格式 wss /v1/{project_id}/rtts
  
- 参数说明
  表1参数说明 
  | 名称         | 是否必选 | 说明                                                                               |
  |:---|:---|:---|
  | project_id | 是    | 项目编号。获取方法，请参见[获取项目ID](https://support.huaweicloud.com/api-sis/sis_03_0008.html)。 |
     
  表2请求Header参数 
  | 参数                    | 是否必选 | 参数类型   | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
  |:---|:---|:---|:---|
  | X-Auth-Token          | 是    | String | 用户Token。 用于获取操作API的权限。获取方法请参见[认证鉴权](https://support.huaweicloud.com/api-sis/sis_03_0058.html)。响应消息头中X-Subject-Token的值即为Token。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
  | Enterprise-Project-Id | 否    | String | 企业项目ID。SIS支持通过企业项目管理（EPS）对不同用户组和用户的资源使用，进行分账。 获取方法：进入"[企业项目管理](https://console.huaweicloud.com/eps/?#/eps/manager/projects)"页面，单击企业项目名称，在企业项目详情页获取Enterprise-Project-Id（企业项目ID）。 ![](https://support.huaweicloud.com/api-sis/zh-cn_image_0000001902247941.png "点击放大") 企业项目创建步骤请参见用户指南。 说明： 账户创建企业项目后，在传参时，有以下三类场景。 - 携带正确的ID，正常使用SIS服务，账单归到企业ID对应的企业项目中。  - 携带错误的ID，正常使用SIS服务，账单的企业项目会被分类为"default"。  - 不携带ID，正常使用SIS服务，账单的企业项目会被分类为"default"。   |
     
  ![](https://support.huaweicloud.com/api-sis/public_sys-resources/note_3.0-zh-cn.png)
  "endpoint"即调用API的请求地址，不同接口不同区域的"endpoint"不同，具体请参见[终端节点](https://support.huaweicloud.com/api-sis/sis_03_0004.html)。
  
- 请求示例（伪码）
  ```
  wss://{endpoint}/v1/{project_id}/rtts
  Request Header:
  X-Auth-Token: MIINRwYJKoZIhvcNAQcCoIINODCCDTQCAQExDTALBglghkgBZQMEAgEwgguVBgkqhkiG...
  ```
  Python3语言请求代码示例
  ```
  # -*- coding: utf-8 -*-
  # 此demo仅供测试使用，强烈建议使用sdk。需提前安装websocket_client, 执行pip install websocket_client
  import websocket
  import threading
  import time
  import json
  def rtts_demo():
      url = 'wss://{{endpoint}}/v1/{{project_id}}/rtts'  # endpoint和project_id需替换
      text = '待合成文本'
      token = '用户对应region的token'
      header = {
          'X-Auth-Token': token
      }
      body = {
          'command': 'START',
          'text': text,
          'config': {
              'audio_format': 'pcm',
              'property': 'chinese_xiaoyu_common',
              'sample_rate': '8000'
          }
      }
      def _on_message(ws, message):
          if isinstance(message, bytes):
              print('receive data length %d' % len(message))
          else:
              print(message)
      def _on_error(ws, error):
          print(error)
      ws = websocket.WebSocketApp(url, header, on_message=_on_message, on_error=_on_error)
      _thread = threading.Thread(target=ws.run_forever, args=(None, None, 30, 20))
      _thread.start()
      time.sleep(1)
      ws.send(json.dumps(body), opcode=websocket.ABNF.OPCODE_TEXT)
      time.sleep(10)
      ws.close()
  if __name__ == '__main__':
      rtts_demo()
  ```
  Java语言请求代码示例
  ```
  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 RttsDemo {
    public void rttsDemo() {
      try {
        // endpoint和projectId需要替换成实际信息。
        String url = "wss://{{endpoint}}/v1/{{project_id}}/rtts";
        String token = "对应region的token";
        String text = "待合成文本";
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder().url(url).header("X-Auth-Token", token).build();
        WebSocket webSocket = okHttpClient.newWebSocket(request, new MyListener());
        webSocket.send("{\"command\": \"START\", \"text\":\"" + text
            + "\", \"config\": {\"audio_format\": \"pcm\", \"property\": \"chinese_xiaoyu_common\"}}");
        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) {
      RttsDemo rttsDemo = new RttsDemo();
      rttsDemo.rttsDemo();
    }
  }
  ```
  
  
 
