全部产品

接口说明

更新时间:2020-11-23 10:51:02

录音文件识别极速版支持使用者通过HTTP POST方式上传一段短音频并在极短时间内(一般来说,30分钟的音频可以在10秒内完成识别)同步获取识别结果,满足音视频字幕、准实时质检等场景下对语音文件识别时效性要求。

功能介绍

  • 音频格式:支持AAC/MP3/OPUS/WAV格式编码的音频。

  • 使用限制:支持100 MB以内音频文件的识别。

  • 模型类型:8000(电话)/16000(非电话)。

    说明

    服务端自动根据请求参数中的采样率对不符合要求的音频进行采样率调整。

  • 支持设置返回结果:支持设置是否将中文数字转为阿拉伯数字输出,支持对多声道音频只处理首个声道。

  • 支持控制台配置项目热词、定制语言模型。

  • 目前支持中文电话通用、中文非电话通用和英文非电话通用三种场景,后续持续增加新模型支持,可在控制台编辑项目进行模型配置。更多信息,请参见管理项目

前提条件

  • 已获取项目appkey,更多信息,请参见创建项目

  • 已获取Access Token,更多信息,请参见获取Token

交互流程

客户端向服务端发送带有音频数据的HTTP POST请求,服务端返回带有识别结果的HTTP响应。

交互流程图

说明

服务端的错误响应会在返回信息中包含表示本次合成任务的task_id参数,请记录该值,如果出现错误,请将task_id和错误信息提交到工单。

服务地址

访问类型

说明

URL

Host

外网访问

所有服务器均可使用外网访问URL。

http://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/FlashRecognizer

nls-gateway.cn-shanghai.aliyuncs.com

阿里云上海ECS内网访问

使用阿里云上海ECS(即ECS地域为华东2(上海)),可使用内网访问URL。 ECS的经典网络不能访问AnyTunnel,即不能在内网访问语音服务;如果希望使用AnyTunnel,需要创建专有网络在其内部访问。

说明

  • 使用内网访问方式,将不产生ECS实例的公网流量费用。

  • 关于ECS的网络类型请参见网络类型

http://nls-gateway.cn-shanghai-internal.aliyuncs.com/stream/v1/FlashRecognizer

nls-gateway.cn-shanghai-internal.aliyuncs.com

注意

以下将以使用外网访问URL的方式进行介绍。如果您使用阿里云上海ECS,并需要通过内网访问URL,则使用HTTP协议,并替换外网访问的URL和Host。

上传音频文件

请求HTTP报文示例。

POST /stream/v1/FlashRecognizer?appkey=23f5****&token=450372e4279bcc2b3c793****&format=wav&sample_rate=16000 HTT
Content-type: application/octet-stream
Content-Length: 94616
Host: nls-gateway.cn-shanghai.aliyuncs.com

[audio data]

一个完整的文件识别极速版RESTful API请求需包含以下要素:HTTP请求行、HTTP请求头部和HTTP请求体。

  • HTTP请求行

    HTTP请求行指定了URL请求参数,由URL和请求参数组成的完整请求链接如下:

    http://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/FlashRecognizer?appkey=Yu1******uncS&format=wav&sample_rate=16000&vocabulary_id=a17******d6b&token=1234*****
    • URL

      协议

      URL

      方法

      HTTP/1.1

      nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/FlashRecognizer

      POST

    • 请求参数

      参数

      类型

      是否必选

      描述

      appkey

      String

      应用appkey。

      format

      String

      音频编码格式。支持格式:WAV/OPUS/AAC/MP3。

      token

      String

      鉴权Token

      sample_rate

      Integer

      表示语音识别模型的采样率,上传的音频如果不符合其取值会被自动升/降采样率至8000或16000。取值:16000(非电话)/8000(电话)。默认:16000。

      vocabulary_id

      String

      添加热词表ID。默认:不添加。

      customization_id

      String

      添加自学习模型ID。默认:不添加。

      enable_inverse_text_normalization

      Boolean

      是否在后处理中执行ITN。取值:true/false。默认:false(不开启)。

      enable_voice_detection

      Boolean

      是否启动语音检测。取值:true/false。默认:false(不开启)。

      enable_word_level_result

      Boolean

      是否返回词级别信息。取值:true/false。默认:false(不开启)。

      first_channel_only

      Boolean

      是否只识别首个声道,取值:true/false。默认:false(不开启)。

  • HTTP请求头部

    HTTP请求头部由“关键字-值”对组成,每行一对,关键字和值用英文冒号“:”分隔,设置内容如下:

    名称

    类型

    是否必选

    描述

    Content-type

    String

    取值“application/octet-stream”,表明HTTP请求体的数据为二进制流。

    Content-Length

    long

    HTTP请求体中请求数据的长度,即音频文件的长度。

    Host

    String

    取值“nls-gateway.cn-shanghai.aliyuncs.com”,为HTTP请求的服务器域名。

  • HTTP请求体

    HTTP请求体传入的是二进制音频数据,因此在HTTP请求头部中的Content-Type必须设置为application/octet-stream

响应结果

发送上传音频的HTTP请求后,会收到服务端的响应,识别结果以JSON字符串的形式保存在响应结果中。

  • 成功响应

    {
        "task_id":"a819f959441b49****",
        "status":20000000,
        "message":"SUCCESS",
        "flash_result":{
            "duration":22,
            "sentences":[
                {
                    "text":"喂,",
                    "words":[
                        {
                            "text":"喂",
                            "begin_time":"1010",
                            "end_time":"1520",
                            "punc":","
                        }
                    ],
                    "begin_time":1010,
                    "end_time":1520,
                    "channel_id":1
                },
                {
                    "text":"哎,",
                    "words":[
                        {
                            "text":"哎",
                            "begin_time":"3540",
                            "end_time":"3570",
                            "punc":","
                        }
                    ],
                    "begin_time":3540,
                    "end_time":3570,
                    "channel_id":1
                },
                {
                    "text":"那五点五十现在是多少点啊,",
                    "words":[
                        {
                            "text":"那",
                            "begin_time":"8810",
                            "end_time":"8840",
                            "punc":""
                        },
                        {
                            "text":"五点",
                            "begin_time":"12750",
                            "end_time":"13200",
                            "punc":""
                        },
                        {
                            "text":"五十",
                            "begin_time":"13200",
                            "end_time":"13890",
                            "punc":""
                        },
                        {
                            "text":"现在",
                            "begin_time":"14330",
                            "end_time":"14600",
                            "punc":""
                        },
                        {
                            "text":"是",
                            "begin_time":"14600",
                            "end_time":"14720",
                            "punc":""
                        },
                        {
                            "text":"多少",
                            "begin_time":"14720",
                            "end_time":"14960",
                            "punc":""
                        },
                        {
                            "text":"点",
                            "begin_time":"19570",
                            "end_time":"21220",
                            "punc":""
                        },
                        {
                            "text":"啊",
                            "begin_time":"21220",
                            "end_time":"22330",
                            "punc":""
                        }
                    ],
                    "begin_time":8810,
                    "end_time":22330,
                    "channel_id":1
                }
            ]
        }
    }

    响应字段说明如下:

    参数

    类型

    描述

    task_id

    String

    32位任务ID。请您记录该值,以便排查错误。

    status

    Integer

    服务状态码。

    message

    String

    服务状态描述。

    flash_result对象参数说明:

    参数

    类型

    描述

    duration

    Integer

    音频时长

    sentences.text

    String

    句子级别的识别结果

    sentences.begin_time

    Integer

    句子的开始时间,单位:毫秒。

    sentences.end_time

    Integer

    句子的结束时间,单位:毫秒。

    sentences.channel_id

    Integer

    多个声道的音频文件会区分返回识别结果,声道id从0计数。

    sentences.words.text

    String

    当前句子包含的词信息

    sentences.words.punc

    String

    当前词尾的标点信息,没有标点则为空。

    sentences.words.begin_time

    Integer

    当前词开始时间,单位:毫秒。

    sentences.words.end_time

    Integer

    当前词结束时间,单位:毫秒。

  • 失败响应

    以鉴权token无效为例:

    {
        "task_id": "8bae3613dfc54ebfa811a17d8a7a****",
        "result": "",
        "status": 40000001,
        "message": "Gateway:ACCESS_DENIED:The token 'c0c1e860f3*******de8091c68a' is invalid!"
    }

服务状态码

服务状态码

服务状态描述

解决方案

20000000

请求成功

无。

40000000

默认的客户端错误码

查看错误消息或提交工单。

40000001

身份认证失败

检查使用的令牌是否正确、是否过期。

40000002

无效的消息

检查发送的消息是否符合要求。

40000003

无效的参数

检查参数值设置是否合理。

40000005

请求数量过多

检查是否超过了并发连接数或者每秒钟请求数。

40270001

不支持的音频格式

请求音频格式不在支持列表

40270002

无效的音频

从音频中没有识别出有效文本

40270003

音频解码错误

按请求格式对音频解码时遇到错误

40270004

无有效音频流

多声道的音频中未抽取到有效音频流

50000000

默认的服务端错误

偶现可以忽略,重复出现请提交工单。

50000001

内部GRPC调用错误

偶现可以忽略,重复出现请提交工单。

快速测试

说明

音频示例WAV文件,使用通用模型。若使用其他音频文件,请填入相应的编码格式和采样率,并在管控台设置对应的模型。

  1. 下载音频文件nls-sample-16k.wav

  2. 使用如下cURL命令行进行极速版识别的RESTful API测试。

    curl -X POST  'http://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/FlashRecognizer?appkey=${appkey}&token=${token}&format=wav&sample_rate=16000' --data-binary @${audio_file}

    举例如下:

    curl -X POST 'http://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/FlashRecognizer?appkey=tt43P2u****&token=4a036531cfdd****&format=wav&sample_rate=16000' --data-binary @./nls-sample-16k.wav

Java示例

依赖文件如下:

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.9.1</version>
</dependency>

<!-- http://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.68.noneautotype</version>
</dependency>

发送请求与响应:

import java.util.HashMap;
import com.alibaba.fastjson.JSONPath;
public class SpeechFlashRecognizerDemo {
    private String appkey;
    public SpeechFlashRecognizerDemo(String appkey) {
        this.appkey = appkey;
    }
    public void process(String fileName, String token,String format, int sampleRate) {
        /**
         * 设置HTTP REST POST请求
         * 1.使用http协议
         * 2.语音识别服务域名:nls-gateway.cn-shanghai.aliyuncs.com
         * 3.语音识别接口请求路径:/stream/v1/FlashRecognizer
         * 4.设置必须请求参数:appkey、token、format、sample_rate
         */
        String url = "https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/FlashRecognizer";
        String request = url;
        request = request + "?appkey=" + appkey;
        request = request + "&token=" + token;
        request = request + "&format=" + format;
        request = request + "&sample_rate=" + sampleRate;

        System.out.println("Request: " + request);
        /**
         * 设置HTTP头部字段
         * 
         * 1.Content-Type:application/octet-stream
         */
        HashMap<String, String> headers = new HashMap<String, String>();
//        headers.put("Content-Type", "application/octet-stream");
        /**
         * 发送HTTP POST请求,返回服务端的响应。
         */
        long start = System.currentTimeMillis();
        String response = HttpUtil.sendPostFile(request, headers, fileName);
        System.out.println("latency = " + (System.currentTimeMillis() - start) + " ms");
        if (response != null) {
            System.out.println("Response: " + response);
        }
        else {
            System.err.println("识别失败!");
        }
    }
    public static void main(String[] args) {
        if (args.length < 2) {
            System.err.println("SpeechRecognizerRESTfulDemo need params: <token> <app-key>");
            System.exit(-1);
        }
        String token = args[0];
        String appkey = args[1];


        SpeechFlashRecognizerDemo demo = new SpeechFlashRecognizerDemo(appkey);
        //String fileName = SpeechRecognizerRestfulDemo.class.getClassLoader().getResource("./nls-sample-16k.wav").getPath();
        // 重要:此处用一个本地文件来模拟发送实时流数据,实际使用时,您可以从某处实时采集或接收语音流并发送到ASR服务端。
        String fileName = "./nls-sample-16k.wav";
        String format = "wav";
        int sampleRate = 16000;

        demo.process(fileName,token, format, sampleRate);
    }
}

其中,HttpUtils类如下:

import okhttp3.*;
import java.io.File;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public class HttpUtil {

    private static String getResponseWithTimeout(Request q) {
        String ret = null;

        OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder();
        OkHttpClient client = httpBuilder.connectTimeout(10, TimeUnit.SECONDS)
                .readTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .build();

        try {
            Response s = client.newCall(q).execute();
            ret = s.body().string();
            s.close();
        } catch (SocketTimeoutException e) {
            ret = null;
            System.err.println("get result timeout");
        } catch (IOException e) {
            System.err.println("get result error " + e.getMessage());
        }

        return ret;
    }

    public static String sendPostFile(String url, HashMap<String, String> headers, String fileName) {
        RequestBody body;

        File file = new File(fileName);
        if (!file.isFile()) {
            System.err.println("The filePath is not a file: " + fileName);
            return null;
        } else {
            body = RequestBody.create(MediaType.parse("application/octet-stream"), file);
        }

        Headers.Builder hb = new Headers.Builder();
        if (headers != null && !headers.isEmpty()) {
            for (Map.Entry<String, String> entry : headers.entrySet()) {
                hb.add(entry.getKey(), entry.getValue());
            }
        }

        Request request = new Request.Builder()
                .url(url)
                .headers(hb.build())
                .post(body)
                .build();

        return getResponseWithTimeout(request);
    }

    public static String sendPostData(String url, HashMap<String, String> headers, byte[] data) {
        RequestBody body;

        if (data.length == 0) {
            System.err.println("The send data is empty.");
            return null;
        } else {
            body = RequestBody.create(MediaType.parse("application/octet-stream"), data);
        }

        Headers.Builder hb = new Headers.Builder();
        if (headers != null && !headers.isEmpty()) {
            for (Map.Entry<String, String> entry : headers.entrySet()) {
                hb.add(entry.getKey(), entry.getValue());
            }
        }

        Request request = new Request.Builder()
                .url(url)
                .headers(hb.build())
                .post(body)
                .build();

        return getResponseWithTimeout(request);
    }
}

C++示例

C++示例使用第三方函数库curl处理HTTP请求和响应,下载curl库和示例文件

目录说明如下:

文件/文件夹

说明

CMakeLists.txt

示例工程的CMakeList文件。

demo

其中的restfulFlashRecognizerDemo.cpp是极速版RESTful API示例。

include

其中curl文件夹是curl库头文件目录。

lib

包含curl动态库,版本为curl-7.60。根据平台不同选如下版本:

  • Linux:Glibc 2.5、Gcc 4/Gcc 5。

  • Windows:VS2013、VS2015。

readme.txt

说明。

release.log

更新记录。

version

版本号。

build.sh

示例编译脚本。

编译运行操作步骤:

假设示例文件已解压至path/to路径下,在Linux终端依次执行如下命令编译运行程序。

  • 支持Cmake:

    1. 确认本地系统已安装Cmake 2.4及以上版本。

    2. cd path/to/sdk/lib

    3. tar -zxvpf linux.tar.gz

    4. cd path/to/sdk

    5. ./build.sh

    6. cd path/to/sdk/demo

    7. ./restfulFlashRecognizerDemo <your-token> <your-appkey>

  • 不支持Cmake:

    1. cd path/to/sdk/lib

    2. tar -zxvpf linux.tar.gz

    3. cd path/to/sdk/demo

    4. g++ -o restfulFlashRecognizerDemo restfulFlashRecognizerDemo.cpp -I path/to/sdk/include -L path/to/sdk/lib/linux -lssl -lcrypto -lcurl -D_GLIBCXX_USE_CXX11_ABI=0

    5. export LD_LIBRARY_PATH=path/to/sdk/lib/linux/

    6. ./restfulFlashRecognizerDemo <your-token> <your-appkey>

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include "curl/curl.h"
using namespace std;
#ifdef _WIN32
string UTF8ToGBK(const string& strUTF8) {
    int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);
    unsigned short * wszGBK = new unsigned short[len + 1];
    memset(wszGBK, 0, len * 2 + 2);
    MultiByteToWideChar(CP_UTF8, 0, (char*)strUTF8.c_str(), -1, (wchar_t*)wszGBK, len);
    len = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)wszGBK, -1, NULL, 0, NULL, NULL);
    char *szGBK = new char[len + 1];
    memset(szGBK, 0, len + 1);
    WideCharToMultiByte(CP_ACP, 0, (wchar_t*)wszGBK, -1, szGBK, len, NULL, NULL);
    string strTemp(szGBK);
    delete[] szGBK;
    delete[] wszGBK;
    return strTemp;
}

#endif

/**
 * RESTful API HTTP请求的响应回调函数
 * 识别结果为JSON格式的字符串
 */
size_t responseCallback(void* ptr, size_t size, size_t nmemb, void* userData) {
    string* srResult = (string*)userData;
    size_t len = size * nmemb;
    char *pBuf = (char*)ptr;
    string response = string(pBuf, pBuf + len);
#ifdef _WIN32
    response = UTF8ToGBK(response);
#endif
    *srResult += response;
    cout << "current result: " << response << endl;
    cout << "total result: " << *srResult << endl;
    return len;
}

int sendAsrRequest(const char* request, const char* token, const char* fileName, string* srResult) {
    CURL* curl = NULL;
    CURLcode res;

    /**
    * 读取音频文件
    */
    ifstream fs;
    fs.open(fileName, ios::out | ios::binary);
    if (!fs.is_open()) {
        cerr << "The audio file is not exist!" << endl; 
        return -1;
    }
    stringstream buffer;
    buffer << fs.rdbuf();
    string audioData(buffer.str());
    curl = curl_easy_init();
    if (curl == NULL) {
        return -1;
    }

    /**
    * 设置HTTP请求行
    */
    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
    curl_easy_setopt(curl, CURLOPT_URL, request);

    /**
    * 设置HTTP请求头部
    */
    struct curl_slist* headers = NULL;

    // Content-Type
    headers = curl_slist_append(headers, "Content-Type:application/octet-stream");
    // Content-Length
    string content_Length = "Content-Length:";
    ostringstream oss;
    oss << content_Length << audioData.length();
    content_Length = oss.str();
    headers = curl_slist_append(headers, content_Length.c_str());

    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

    /**
    * 设置HTTP请求数据
    */
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, audioData.c_str());
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, audioData.length());

    /**
    * 设置HTTP请求的响应回调函数
    */
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, responseCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, srResult);

    /**
    * 发送HTTP请求
    */
    res = curl_easy_perform(curl);

    // 释放资源
    curl_slist_free_all(headers);
    curl_easy_cleanup(curl);

    if (res != CURLE_OK) {
        cerr << "curl_easy_perform failed: " << curl_easy_strerror(res) << endl;
        return -1;
    }
    return 0;
}

int process(const char* request, const char* token, const char* fileName) {
    // 全局只初始化一次
    curl_global_init(CURL_GLOBAL_ALL);
    string srResult = "";
    int ret = sendAsrRequest(request, token, fileName, &srResult);
    curl_global_cleanup();
    return ret;
}

int main(int argc, char* argv[]) {

    if (argc < 3) {
        cerr << "params is not valid. Usage: ./demo your_token your_appkey" << endl;
        return -1;
    }
    string token = argv[1];
    string appKey = argv[2];
    string url = "https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/FlashRecognizer";
    string format = "wav";
    int sampleRate = 16000;
    string fileName = "nls-sample-16k.wav";

    /**
    * 设置RESTful请求参数
    */
    ostringstream oss;
    oss << url;
    oss << "?appkey=" << appKey;
    oss << "&token=" << token;
    oss << "&format=" << format;
    oss << "&sample_rate=" << sampleRate;

    string request = oss.str();
    cout << "request: " << request << endl;
    process(request.c_str(), token.c_str(), fileName.c_str());
    return 0;
}

Python示例

说明
  • Python 2.x请使用httplib模块;Python 3.x请使用http.client模块。

  • 采用RFC 3986规范进行urlencode编码,Python 2.x请使用urllib模块的urllib.quote,Python 3.x请使用urllib.parse模块的urllib.parse.quote_plus。

  • 如果使用内网访问URL,请使用HTTP协议,需要替换如下函数,即将HTTPSConnection修改为HTTPConnection

        # Python 2.x 请使用httplib
        # conn = httplib.HTTPConnection(host)
    
        # Python 3.x 请使用http.client
        conn = http.client.HTTPConnection(host)
# -*- coding: UTF-8 -*-
# Python 2.x引入httplib模块
# import httplib
# Python 3.x引入http.client模块

import http.client
import json
def process(request, audioFile) :
# 读取音频文件
with open(audioFile, mode = 'rb') as f:
audioContent = f.read()
host = 'nls-gateway.cn-shanghai.aliyuncs.com'
# 设置HTTP请求头部
httpHeaders = {
'Content-Length': len(audioContent)
}
# Python 2.x使用httplib
# conn = httplib.HTTPConnection(host)
# Python 3.x使用http.client
conn = http.client.HTTPConnection(host)
conn.request(method='POST', url=request, body=audioContent, headers=httpHeaders)
response = conn.getresponse()
print('Response status and response reason:')
print(response.status ,response.reason)
body = response.read()
try:
print('Recognize response is:')
body = json.loads(body)
print(body)
status = body['status']
if status == 20000000 :
result = body['result']
print('Recognize result: ' + result)
else :
print('Recognizer failed!')
except ValueError:
print('The response is not json format string')
conn.close()
appKey = '您的appkey'
token = '您的token'
# 服务请求地址
url = 'https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/FlashRecognizer'
# 音频文件下载地址:https://aliyun-nls.oss-cn-hangzhou.aliyuncs.com/asr/fileASR/examples/nls-sample-16k.wav
audioFile = 'nls-sample-16k.wav'
format = 'wav'
sampleRate = 16000
print(type(sampleRate))
enablePunctuationPrediction = True
enableInverseTextNormalization = True
enableVoiceDetection = False
# 设置RESTful请求参数
request = url + '?appkey=' + appKey
request = request + '&token=' + token
request = request + '&format=' + format
request = request + '&sample_rate=' + str(sampleRate)
print('Request: ' + request)
process(request, audioFile)

PHP示例

说明

PHP示例中使用了cURL函数,要求PHP版本在4.0.2以上,并且确保已安装cURL扩展。

<?php
function process($token, $request, $audioFile)
 {
/**
* 读取音频文件
*/
$audioContent = file_get_contents($audioFile);
if ($audioContent == FALSE) {
print "The audio file is not exist!\n";
return;
}

$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 120);

/**
* 设置HTTP请求行
*/
curl_setopt($curl, CURLOPT_URL, $request);
curl_setopt($curl, CURLOPT_POST,TRUE);

/**
* 设置HTTP请求头部
*/
$contentType = "application/octet-stream";
$contentLength = strlen($audioContent);
$headers = array(
// "X-NLS-Token:" . $token,
"Content-type:" . $contentType,
"Content-Length:" . strval($contentLength)
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

/**
* 设置HTTP请求数据
*/
curl_setopt($curl, CURLOPT_POSTFIELDS, $audioContent);
curl_setopt($curl, CURLOPT_NOBODY, FALSE);

/**
* 发送HTTP请求
*/
$returnData = curl_exec($curl);
curl_close($curl);
if ($returnData == FALSE) {
print "curl_exec failed!\n";
return;
}
print $returnData . "\n";
$resultArr = json_decode($returnData, true);
$status = $resultArr["status"];
if ($status == 20000000) {
$result = $resultArr["result"];
print "The audio file recognized result: " . $result . "\n";
}
else {
print "The audio file recognized failed.\n";
}
}
$appkey = "您的appkey";
$token = "您的token";
$url = "https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/FlashRecognizer";
//$audioFile = "/path/to/nls-sample-16k.wav";
$audioFile = "./nls-sample-16k.wav";
$format = "wav";
$sampleRate = 16000;

/**
* 设置RESTful请求参数
*/
$request = $url;
$request = $request . "?appkey=" . $appkey;
$request = $request . "&token=" . $token;
$request = $request . "&format=" . $format;
$request = $request . "&sample_rate=" . strval($sampleRate);
print "Request: " . $request . "\n";
process($token, $request, $audioFile);
?>