语音识别java版demo

一、前言


国内做语音识别的公司有很多,大家所熟知的几家公司主要有科大讯飞、阿里云、百度、腾讯等,由于各家的API或者SDK对接方式都差不多,本文采用百度的API进行演示。

二、对接流程


第一步:成为开发者


三步完成账号的基本注册与认证:

STEP1:点击进入控制台,选择需要使用的AI服务项。若为未登录状态,将跳转至登录界面,请您使用百度账号登录。如还未持有百度账户,可以点击此处注册百度账号

STEP2:首次使用,登录后将会进入开发者认证页面,请填写相关信息完成开发者认证。注:(如您之前已经是百度云用户或百度开发者中心用户,此步可略过。)

STEP3:通过控制台左侧导航,选择语音能力引擎,进入语音技术的控制面板,进行相关操作。

第二步:领取免费额度


因为本文是个人版本的demo,所以使用的是免费额度(180天),正式企业应用也有一定的免费额度,当然后期使用肯定是需要付费的。

点击去领取:

选中语音识别:

  1. 点击全选或者根据自己需要选择即可

  1. 点击0元领取,然后刷新列表就可以看到自己已经领取成功了

第三步:创建应用


需要创建应用才可正式调用语音技术能力,基于应用创建成功后获取的API Key及Secret Key,进行接口调用操作,及相关配置。按照下图所示的操作流程,完成创建操作即可。

1.点击去创建

应用名称: 用于标识您所创建的应用的名称,支持中英文、数字、下划线及中横线,此名称一经创建完毕,不可修改。

接口选择: 每个应用可以勾选业务所需的所有AI服务的接口权限(仅可勾选具备免费试用权限的接口能力),语音技术下全部接口已默认勾选,创建应用完毕,此应用即具备了所勾选服务的调用权限。

语音包名:如果您需要使用语音技术SDK服务(iOS/Android),需要绑定包名信息,以便生成授权License。

应用归属:可选择个人使用或公司使用服务,若为公司使用,可与专属商务经理沟通,获取专业的售前支持。

应用描述: 对此应用的业务场景进行描述。

第四步:获取密钥


在创建完毕应用后,平台将会分配给我们此应用的相关凭证,主要为AppID、API Key、Secret Key。

第五步:生成签名


使用创建应用所分配到的AppID、API Key及Secret Key,进行Access Token(用户身份验证和授权的凭证)的生成。具体如下:

请求URL数据格式:

向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上以下参数:

  • grant_type: 必须参数,固定为client_credentials;

  • client_id: 必须参数,应用的API Key;

  • client_secret: 必须参数,应用的Secret Key;

注:

  • API Key、Secret Key 均可在百度智能云控制台 各技术方向概览页的应用列表 处获取,若无应用请先进行创建;

  • API Key、Secret Key用于接口调用鉴权,请务必注意保密,不可在公开文档或代码中以明文展示,否则可能导致账号被盗用。

例如:

https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2

java版本示例:

​
packagecom.baidu.ai.aip.auth;
​
importorg.json.JSONObject;
​
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.net.HttpURLConnection;
importjava.net.URL;
importjava.util.List;
importjava.util.Map;
​
/**
* 获取token类
*/
publicclassAuthService {
​
    /**
    * 获取权限token
    * @return 返回示例:
    * {
    * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
    * "expires_in": 2592000
    * }
    */
    publicstaticStringgetAuth() {
        // 官网获取的 API Key 更新为你注册的
        StringclientId="百度云应用的AK";
        // 官网获取的 Secret Key 更新为你注册的
        StringclientSecret="百度云应用的SK";
        returngetAuth(clientId, clientSecret);
    }
​
    /**
    * 获取API访问token
    * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
    * @param ak - 百度云官网获取的 API Key
    * @param sk - 百度云官网获取的 Secret Key
    * @return assess_token 示例:
    * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
    */
    publicstaticStringgetAuth(Stringak, Stringsk) {
        // 获取token地址
        StringauthHost="https://aip.baidubce.com/oauth/2.0/token?";
        StringgetAccessTokenUrl=authHost
            // 1. grant_type为固定参数
            +"grant_type=client_credentials"
            // 2. 官网获取的 API Key
            +"&client_id="+ak
            // 3. 官网获取的 Secret Key
            +"&client_secret="+sk;
        try {
            URLrealUrl=newURL(getAccessTokenUrl);
            // 打开和URL之间的连接
            HttpURLConnectionconnection= (HttpURLConnection) realUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>>map=connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (Stringkey : map.keySet()) {
                System.err.println(key+"--->"+map.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            BufferedReaderin=newBufferedReader(newInputStreamReader(connection.getInputStream()));
            Stringresult="";
            Stringline;
            while ((line=in.readLine()) !=null) {
                result+=line;
            }
            /**
            * 返回结果示例
            */
            System.err.println("result:"+result);
            JSONObjectjsonObject=newJSONObject(result);
            Stringaccess_token=jsonObject.getString("access_token");
            returnaccess_token;
        } catch (Exceptione) {
            System.err.printf("获取token失败!");
            e.printStackTrace(System.err);
        }
        returnnull;
    }
​
}

服务器返回的JSON文本参数如下:

  • access_token: 要获取的Access Token;

  • expires_in: Access Token的有效期(秒为单位,有效期30天);

  • 其他参数忽略,暂时不用;

例如:

{
  "refresh_token": "25.b55fe1d287227ca97aab219bb249b8ab.315360000.1798284651.282335-8574074",
  "expires_in": 2592000,
  "scope": "public wise_adapt",
  "session_key": "9mzdDZXu3dENdFZQurfg0Vz8slgSgvvOAUebNFzyzcpQ5EnbxbF+hfG9DQkpUVQdh4p6HbQcAiz5RmuBAja1JJGgIdJI",
  "access_token": "24.6c5e1ff107f0e8bcef8c46d3424a0e78.2592000.1485516651.282335-8574074",
  "session_secret": "dfac94a3489fe9fca7c3221cbf7525ff"
}

若请求错误,服务器将返回的JSON文本包含以下参数:

  • error: 错误码;关于错误码的详细信息请参考下方鉴权认证错误码。

  • error_description: 错误描述信息,帮助理解和解决发生的错误。

例如:

{
    "error": "invalid_client",
    "error_description": "unknown client id"
}

鉴权认证错误码:

error

error_description

解释

invalid_client

unknown client id

API Key不正确

invalid_client

Client authentication failed

Secret Key不正确

第六步:启动开发


百度提供了两种对接方式:API与SDK。我们这里选择了API的方式进行对接。

请求说明

语音数据上传 POST 方式有 2 种:

  1. JSON 格式 POST 上传本地音频文件。

  1. RAW 格式 POST 上传本地音频文件。

JSON 方式
  • 音频文件,读取二进制内容后,进行 base64 编码后放在 speech 参数内。

  • 音频文件的原始大小, 即二进制内容的字节数,填写 “len” 字段

由于使用 json 格式, header 为:Content-Type:application/json注意: 由于 base64 编码后,数据会增大 1/3。

RAW方式
  • 音频文件,读取二进制内容后,直接放在 body 中。

  • Content-Length 的值即为音频文件的大小。(一般代码会自动生成)。

由于使用 raw 方式, 采样率和文件格式需要填写在 Content-Type 中 :Content-Type: audio/pcm;rate=16000

JSON方式上传音频

语音数据和其他参数通过标准 JSON 格式串行化 POST 上传, JSON 里包括的参数:

字段名

类型

可需

描述

format

string

必填

语音文件的格式,pcm/wav/amr/m4a。不区分大小写。推荐pcm文件

rate

int

必填

采样率,16000、8000,固定值

channel

int

必填

声道数,仅支持单声道,请填写固定值 1

cuid

string

必填

用户唯一标识,用来区分用户,计算UV值。建议填写能区分用户的机器 MAC 地址或 IMEI 码,长度为60字符以内。

token

string

必填

开放平台获取到的开发者[access_token]

获取 Access Token "access_token")

dev_pid

int

选填

不填写lan参数生效,都不填写,默认1537(普通话 输入法模型),dev_pid参数点击这里

lm_id

int

选填

自训练平台模型id,填dev_pid = 1537生效

lan

string

选填,废弃参数

历史兼容参数,已不再使用

speech

string

必填

本地语音文件的二进制语音数据 ,需要进行base64 编码。与len参数连一起使用。

len

int

必填

本地语音文件的的字节数,单位字节

上传示例

JSON 格式 POST 上传本地文件

固定头部 header
Content-Type:application/json
请求示例
POSThttp://vop.baidu.com/server_api 

speech 参数填写为 文件内容 base64 后的结果:

{     
  "format":"pcm",     
  "rate":16000,     
  "dev_pid":1537,     
  "channel":1,     
  "token":xxx,     
  "cuid":"baidu_workshop",     
  "len":4096,     
  "speech":"xxx", // xxx为 base64(FILE_CONTENT) 
}
返回示例
{
"corpus_no":"6433214037620997779",
"err_msg":"success.",
"err_no":0,"result":["北京科技馆。"],
"sn":"371191073711497849365"
}
注意事项

len 字段表示原始语音大小字节数,不是 base64 编码之后的长度。

RAW 方式上传音频

语音数据直接放在 HTTP BODY 中,控制参数以及相关统计信息通过 header 和 url 里参数传递。

Header 参数说明

字段名

数据类型

可需

描述

format

string(格式见下面示例)

必填

语音格式,pcm/wav/amr/(m4a仅支持极速版)。不区分大小写,推荐使用pcm文件

rate

int(格式见下面示例)

必填

采样率 16000、8000, 固定值

语音数据的采样率和压缩格式在 HTTP-HEADER 里的 Content-Type 表明,例:

Content-Type: audio/pcm;rate=16000
url 参数说明

字段名

可需

描述

cuid

必填

用户唯一标识,用来区分用户,计算 UV 值。建议填写能区分用户的机器 MAC 地址或 IMEI 码,长度为 60 字符以内。

token

必填

开放平台获取到的开发者 [access_token]

获取 Access Token "access_token")

dev_pid

选填

不填写 lan 参数生效,都不填写,默认 1537(普通话 输入法模型),dev_pid参数点击这里

lm_id

int

选填

lan

选填,废弃参数

历史兼容参数,已不再使用。

URL 示例
POSThttp://vop.baidu.com/server_api?dev_pid=1537&cuid=******&token=1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328

// 或者使用自训练平台

POSThttp://vop.baidu.com/server_api?dev_pid=8002&lm_id=1234&cuid=******&token=1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328 
raw 方式测试示例
curl-i-XPOST-H"Content-Type: audio/pcm;rate=16000""http://vop.baidu.com/server_api?dev_pid=1537&cuid=xxxxx&token=1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328"--data-binary"@/home/test/test.pcm"

三、demo示例


第一步:准备音频文件


第二步:生成token


packagecom.speech.demo.common;
​
​
importcom.alibaba.fastjson2.JSONObject;
​
importjava.io.IOException;
importjava.net.HttpURLConnection;
importjava.net.URL;
​
/**
* token的获取类
* 将apiKey和secretKey换取token,注意有效期保存在expiresAt
*/
publicclassTokenHolder {
​
    publicstaticfinalStringASR_SCOPE="audio_voice_assistant_get";
​
    publicstaticfinalStringTTS_SCOPE="audio_tts_post";
​
    /**
     * url , Token的url,http可以改为https
     */
    privatestaticfinalStringurl="http://aip.baidubce.com/oauth/2.0/token";
​
    /**
     * asr的权限 scope 是  "audio_voice_assistant_get"
     * tts 的权限 scope 是 "audio_tts_post"
     */
    privateStringscope;
​
    /**
     * 网页上申请语音识别应用获取的apiKey
     */
    privateStringapiKey;
​
    /**
     * 网页上申请语音识别应用获取的secretKey
     */
    privateStringsecretKey;
​
    /**
     * 保存访问接口获取的token
     */
    privateStringtoken;
​
    /**
     * 当前的时间戳,毫秒
     */
    privatelongexpiresAt;
​
    /**
     * @param apiKey    网页上申请语音识别应用获取的apiKey
     * @param secretKey 网页上申请语音识别应用获取的secretKey
     */
    publicTokenHolder(StringapiKey, StringsecretKey, Stringscope) {
        this.apiKey=apiKey;
        this.secretKey=secretKey;
        this.scope=scope;
    }
​
​
    /**
     * 获取token,refresh 方法后调用有效
     *
     * @return
     */
    publicStringgetToken() {
        returntoken;
    }
​
    /**
     * 获取过期时间,refresh 方法后调用有效
     *
     * @return
     */
    publiclonggetExpiresAt() {
        returnexpiresAt;
    }
​
​
    /**
     * 获取token
     *
     * @return
     * @throws IOException   http请求错误
     * @throws DemoException http接口返回不是 200, access_token未获取
     */
    publicvoidrefresh() throwsIOException, DemoException {
        StringgetTokenURL=url+"?grant_type=client_credentials"
                +"&client_id="+ConnUtil.urlEncode(apiKey) +"&client_secret="+ConnUtil.urlEncode(secretKey);
​
        // 打印的url出来放到浏览器内可以复现
        System.out.println("token url:"+getTokenURL);
​
        URLurl=newURL(getTokenURL);
        HttpURLConnectionconn= (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5000);
        Stringresult=ConnUtil.getResponseString(conn);
        System.out.println("Token result json:"+result);
        parseJson(result);
    }
​
    /**
     * @param result token接口获得的result
     * @throws DemoException
     */
    privatevoidparseJson(Stringresult) throwsDemoException {
        JSONObjectjson=JSONObject.parseObject(result);
        if (json.getString("access_token") ==null) {
            // 返回没有access_token字段
            thrownewDemoException("access_token not obtained, "+result);
        }
        if (json.getString("scope") ==null) {
            // 返回没有scope字段
            thrownewDemoException("scopenot obtained, "+result);
        }
        // scope = null, 忽略scope检查
​
        if (scope!=null&&!json.getString("scope").contains(scope)) {
            thrownewDemoException("scope not exist, "+scope+","+result);
        }
        token=json.getString("access_token");
        expiresAt=System.currentTimeMillis() +json.getLong("expires_in") *1000;
    }
}

第三步:调用API测试


语音识别测试:

packagecom.speech.demo.test;
​
​
importcom.alibaba.fastjson2.JSONObject;
importcom.speech.demo.common.ConnUtil;
importcom.speech.demo.common.DemoException;
importcom.speech.demo.common.TokenHolder;
​
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.net.HttpURLConnection;
importjava.net.URL;
importjava.util.Base64;
​
publicclassAsrMain {
    /**
     * 默认以json方式上传音频文件
     */
​
    privatefinalbooleanMETHOD_RAW=false;
    /**
     * 填写网页上申请的appkey 如 $apiKey="kVcnfD9iW2XVZSMaLMrtLYIz"
     */
    privatefinalStringAPP_KEY="你的appKey";
​
    /**
     * 填写网页上申请的APP SECRET 如 $SECRET_KEY="O9o1O213UgG5LFn0bDGNtoRN3VWl2du6"
     */
    privatefinalStringSECRET_KEY="你的secretKey";
​
    // 需要识别的文件
    privatefinalStringFILENAME="16k.pcm";
​
    /**
     * 文件格式, 支持pcm/wav/amr 格式,极速版额外支持m4a 格式
     */
    privatefinalStringFORMAT=FILENAME.substring(FILENAME.length() -3);
​
    privateStringCUID="1234567JAVA";
​
    // 采样率固定值
    privatefinalintRATE=16000;
​
    privateStringURL;
​
    privateintDEV_PID;
​
    //private int LM_ID;//测试自训练平台需要打开此注释
​
    privateStringSCOPE;
​
    //  普通版 参数
    {
        // 可以改为https
        URL="http://vop.baidu.com/server_api";
        //  1537 表示识别普通话,使用输入法模型。 其它语种参见文档
        DEV_PID=1537;
        SCOPE="audio_voice_assistant_get";
    }
​
    // 自训练平台 参数
    /*{
        //自训练平台模型上线后,您会看见 第二步:“”获取专属模型参数pid:8001,modelid:1234”,按照这个信息获取 dev_pid=8001,lm_id=1234
        DEV_PID = 8001;
        LM_ID = 1234;
    }*/
​
    /* 极速版 参数
    {
        URL =   "http://vop.baidu.com/pro_api"; // 可以改为https
        DEV_PID = 80001;
        SCOPE = "brain_enhanced_asr";
    }
    */
​
    /* 忽略scope检查,非常旧的应用可能没有
    {
        SCOPE = null;
    }
    */
​
    publicstaticvoidmain(String[] args) throwsIOException, DemoException {
        AsrMaindemo=newAsrMain();
        // 填写下面信息
        Stringresult=demo.run();
        System.out.println("识别结束:结果是:");
        System.out.println(result);
​
        // 如果显示乱码,请打开result.txt查看
        Filefile=newFile("result.txt");
        FileWriterfo=newFileWriter(file);
        fo.write(result);
        fo.close();
        System.out.println("Result also wrote into "+file.getAbsolutePath());
    }
​
​
    publicStringrun() throwsIOException, DemoException {
        TokenHolderholder=newTokenHolder(APP_KEY, SECRET_KEY, SCOPE);
        holder.refresh();
        Stringtoken=holder.getToken();
        Stringresult=null;
        if (METHOD_RAW) {
            result=runRawPostMethod(token);
        } else {
            result=runJsonPostMethod(token);
        }
        returnresult;
    }
​
    privateStringrunRawPostMethod(Stringtoken) throwsIOException, DemoException {
        Stringurl2=URL+"?cuid="+ConnUtil.urlEncode(CUID) +"&dev_pid="+DEV_PID+"&token="+token;
        //测试自训练平台需要打开以下信息
        //String url2 = URL + "?cuid=" + ConnUtil.urlEncode(CUID) + "&dev_pid=" + DEV_PID + "&lm_id="+ LM_ID + "&token=" + token;
        StringcontentTypeStr="audio/"+FORMAT+"; rate="+RATE;
        //System.out.println(url2);
        byte[] content=getFileContent(FILENAME);
        HttpURLConnectionconn= (HttpURLConnection) newURL(url2).openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestProperty("Content-Type", contentTypeStr);
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
        conn.getOutputStream().write(content);
        conn.getOutputStream().close();
        System.out.println("url is "+url2);
        System.out.println("header is  "+"Content-Type :"+contentTypeStr);
        Stringresult=ConnUtil.getResponseString(conn);
        returnresult;
    }
​
    publicStringrunJsonPostMethod(Stringtoken) throwsDemoException, IOException {
​
        byte[] content=getFileContent(FILENAME);
        Stringspeech=base64Encode(content);
​
        JSONObjectparams=newJSONObject();
        params.put("dev_pid", DEV_PID);
        //params.put("lm_id",LM_ID);//测试自训练平台需要打开注释
        params.put("format", FORMAT);
        params.put("rate", RATE);
        params.put("token", token);
        params.put("cuid", CUID);
        params.put("channel", "1");
        params.put("len", content.length);
        params.put("speech", speech);
​
        // System.out.println(params.toString());
        HttpURLConnectionconn= (HttpURLConnection) newURL(URL).openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");
        conn.setDoOutput(true);
        conn.getOutputStream().write(params.toString().getBytes());
        conn.getOutputStream().close();
        Stringresult=ConnUtil.getResponseString(conn);
​
​
        params.put("speech", "base64Encode(getFileContent(FILENAME))");
        System.out.println("url is : "+URL);
        System.out.println("params is :"+params.toString());
​
​
        returnresult;
    }
​
    privatebyte[] getFileContent(Stringfilename) throwsDemoException, IOException {
        Filefile=newFile(filename);
        if (!file.canRead()) {
            System.err.println("文件不存在或者不可读: "+file.getAbsolutePath());
            thrownewDemoException("file cannot read: "+file.getAbsolutePath());
        }
        FileInputStreamis=null;
        try {
            is=newFileInputStream(file);
            returnConnUtil.getInputStreamContent(is);
        } finally {
            if (is!=null) {
                try {
                    is.close();
                } catch (IOExceptione) {
                    e.printStackTrace();
                }
            }
        }
​
    }
​
    privateStringbase64Encode(byte[] content) {
​
        Base64.Encoderencoder=Base64.getEncoder(); // JDK 1.8  推荐方法
        Stringstr=encoder.encodeToString(content);
​
        /*char[] chars = Base64Util.encode(content); // 1.7 及以下,不推荐,请自行跟换相关库
        String str = new String(chars);*/
​
        returnstr;
    }
​
}

说明:

  • appKey和secretKey填写你自己创建应用的即可,demo中使用的是我的

语音合成测试:

packagecom.speech.demo.test;
​
importcom.speech.demo.common.ConnUtil;
importcom.speech.demo.common.DemoException;
importcom.speech.demo.common.TokenHolder;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.net.HttpURLConnection;
importjava.net.URL;
​
​
publicclassTtsMain {
​
    publicstaticvoidmain(String[] args) throwsIOException, DemoException {
        (newTtsMain()).run();
    }
​
    /**
     * 填写网页上申请的appkey 如 $apiKey="kVcnfD9iW2XVZSMaLMrtLYIz"
     */
    privatefinalStringappKey="你的appKey";
​
    /**
     * 填写网页上申请的APP SECRET 如 $SECRET_KEY="O9o1O213UgG5LFn0bDGNtoRN3VWl2du6"
     */
    privatefinalStringsecretKey="你的secretKey";
​
    // text 的内容为"欢迎使用百度语音合成"的urlencode,utf-8 编码
    // 可以百度搜索"urlencode"
    privatefinalStringtext="欢迎使用百度语音";
​
    // 发音人选择, 基础音库:0为度小美,1为度小宇,3为度逍遥,4为度丫丫,
    // 精品音库:5为度小娇,103为度米朵,106为度博文,110为度小童,111为度小萌,默认为度小美
    privatefinalintper=0;
    // 语速,取值0-15,默认为5中语速
    privatefinalintspd=5;
    // 音调,取值0-15,默认为5中语调
    privatefinalintpit=5;
    // 音量,取值0-9,默认为5中音量
    privatefinalintvol=5;
​
    // 下载的文件格式, 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wav
    privatefinalintaue=6;
​
    // 可以使用https
    publicfinalStringurl="http://tsn.baidu.com/text2audio";
​
    privateStringcuid="1234567JAVA";
​
    privatevoidrun() throwsIOException, DemoException {
        TokenHolderholder=newTokenHolder(appKey, secretKey, TokenHolder.ASR_SCOPE);
        holder.refresh();
        Stringtoken=holder.getToken();
​
        // 此处2次urlencode, 确保特殊字符被正确编码
        Stringparams="tex="+ConnUtil.urlEncode(ConnUtil.urlEncode(text));
        params+="&per="+per;
        params+="&spd="+spd;
        params+="&pit="+pit;
        params+="&vol="+vol;
        params+="&cuid="+cuid;
        params+="&tok="+token;
        params+="&aue="+aue;
        params+="&lan=zh&ctp=1";
        System.out.println(url+"?"+params); // 反馈请带上此url,浏览器上可以测试
        HttpURLConnectionconn= (HttpURLConnection) newURL(url).openConnection();
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setConnectTimeout(5000);
        PrintWriterprintWriter=newPrintWriter(conn.getOutputStream());
        printWriter.write(params);
        printWriter.close();
        StringcontentType=conn.getContentType();
        if (contentType.contains("audio/")) {
            byte[] bytes=ConnUtil.getResponseBytes(conn);
            Stringformat=getFormat(aue);
            Filefile=newFile("result."+format); // 打开mp3文件即可播放
            // System.out.println( file.getAbsolutePath());
            FileOutputStreamos=newFileOutputStream(file);
            os.write(bytes);
            os.close();
            System.out.println("audio file write to "+file.getAbsolutePath());
        } else {
            System.err.println("ERROR: content-type= "+contentType);
            Stringres=ConnUtil.getResponseString(conn);
            System.err.println(res);
        }
    }
​
    // 下载的文件格式, 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wav
    privateStringgetFormat(intaue) {
        String[] formats= {"mp3", "pcm", "pcm", "wav"};
        returnformats[aue-3];
    }
}

第四步:结果展示


语音识别结果展示:

语音合成结果展示:

demo示例git地址:


https://gitlab.supcon5t.com/zhaojun/Sup-Speech-Demo.git

四、在线调试


如果不想在本地调试,也可以在线调试,百度提供了在线调试的方式:在线调试地址

五、总结


  • 总体来说整个对接还是比较简单的,主要是用appKey和secretKey生成token,然后按照API要求进行调用即可

  • 其他厂商的API调用基本也差不多这样,当然他们也提供SDK的集成方式,至于选择哪种方式都可以

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值