code: public TtsVoiceSenderResult send(String nationCode, String phoneNumber,
          int templateId, ArrayList<String> params,
          int playtimes, String ext)
              throws HTTPException, JSONException, IOException {
  
          long random = SmsSenderUtil.getRandom();
          long now = SmsSenderUtil.getCurrentTime();
          JSONObject body = new JSONObject()
              .put("tel", (new JSONObject()).put("nationcode", nationCode).put("mobile", phoneNumber))
              .put("tpl_id", templateId)
              .put("params", params)
              .put("playtimes", playtimes)
              .put("sig", SmsSenderUtil.calculateSignature(this.appkey, random, now, phoneNumber))
              .put("time", now)
              .put("ext", SmsSenderUtil.isNotEmpty(ext) ? ext : "");
  
          HTTPRequest req = new HTTPRequest(HTTPMethod.POST, this.url)
              .addHeader("Conetent-Type", "application/json")
              .addQueryParameter("sdkappid", this.appid)
              .addQueryParameter("random", random)
              .setConnectionTimeout(60 * 1000)
              .setRequestTimeout(60 * 1000)
              .setBody(body.toString());
  
          try {
              // May throw IOException and URISyntaxexception
              HTTPResponse res = httpclient.fetch(req);
  
              // May throw HTTPException
              handleError(res);
  
              // May throw JSONException
              return (new TtsVoiceSenderResult()).parseFromHTTPResponse(res);
          } catch(URISyntaxException e) {
              throw new RuntimeException("API url has been modified, current url: " + url);
          }
      }
docs: 指定模板发送语音短信
  
  @param nationCode  国家码，如86为中国
  @param phoneNumber  不带国家码的手机号
  @param templateId  信息内容
  @param params  模板参数列表
  @param playtimes  播放次数
  @param ext  扩展字段，原样返回
  @return {@link}TtsVoiceSenderResult
  @throws HTTPException  http status exception
  @throws JSONException  json parse exception
  @throws IOException    network problem