首页 > 开发 > Java > 正文

Java实现的百度语音识别功能示例

2024-07-14 08:42:09
字体:
来源:转载
供稿:网友

本文实例讲述了Java实现的百度语音识别功能。分享给大家供大家参考,具体如下:

SDK以及示例代码下载地址: http://yuyin.baidu.com/sdk

最近一直在搞java,就选择了java工程。将代码拷过去。同时复制文件“test.pcm”到工程目录下。就基本上可以了。

注:test.pcm是语音文件,可以用audacity软件打开,选择 文件->导入->裸数据。 设置采样率为8000Hz。点击播放就能听见声音了。

这个时候程序跑起来还有问题,需要将apiKey 以及secretKey填写上。这两个值是你申请应用对应的分配好的。

cuid填本机mac地址就可以了,这个值我试过好像无所谓没啥要求。

程序能跑起来,并且按照正常返回识别的语音结果。但是返回结果的编码为GBK,所以汉字显示为乱码,需要对其进行一次转码。转码的代码是我自己加上去的。

下面贴代码:

package com.baidu.speech.serviceapi;import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLDecoder;import java.net.URLEncoder;import javax.xml.bind.DatatypeConverter;import org.json.JSONObject;public class Sample {  private static final String serverURL = "http://vop.baidu.com/server_api";  private static String token = "";  private static final String testFileName = "test.pcm"; // 百度语音提供技术支持  //put your own params here  // 下面3个值要填写自己申请的app对应的值  private static final String apiKey = "";  private static final String secretKey = "";  private static final String cuid = "";  public static void main(String[] args) throws Exception {    getToken();    method1();    method2();  }  private static void getToken() throws Exception {    String getTokenURL = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials" +      "&client_id=" + apiKey + "&client_secret=" + secretKey;    HttpURLConnection conn = (HttpURLConnection) new URL(getTokenURL).openConnection();    token = new JSONObject(printResponse(conn)).getString("access_token");  }  private static void method1() throws Exception {    File pcmFile = new File(testFileName);    HttpURLConnection conn = (HttpURLConnection) new URL(serverURL).openConnection();    // construct params    JSONObject params = new JSONObject();    params.put("format", "pcm");    params.put("rate", 8000);    params.put("channel", "1");    params.put("token", token);    params.put("lan", "zh");    params.put("cuid", cuid);    params.put("len", pcmFile.length());    params.put("speech", DatatypeConverter.printBase64Binary(loadFile(pcmFile)));    // add request header    conn.setRequestMethod("POST");    conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");    conn.setDoInput(true);    conn.setDoOutput(true);    // send request    DataOutputStream wr = new DataOutputStream(conn.getOutputStream());    wr.writeBytes(params.toString());    wr.flush();    wr.close();    printResponse(conn);  }  private static void method2() throws Exception {    File pcmFile = new File(testFileName);    HttpURLConnection conn = (HttpURLConnection) new URL(serverURL        + "?cuid=" + cuid + "&token=" + token).openConnection();    // add request header    conn.setRequestMethod("POST");    conn.setRequestProperty("Content-Type", "audio/pcm; rate=8000");    conn.setDoInput(true);    conn.setDoOutput(true);    // send request    DataOutputStream wr = new DataOutputStream(conn.getOutputStream());    wr.write(loadFile(pcmFile));    wr.flush();    wr.close();    System.out.println(getUtf8String(printResponse(conn)));  }  private static String printResponse(HttpURLConnection conn) throws Exception {    if (conn.getResponseCode() != 200) {      // request error     System.out.println("conn.getResponseCode() = " + conn.getResponseCode());      return "";    }    InputStream is = conn.getInputStream();    BufferedReader rd = new BufferedReader(new InputStreamReader(is));    String line;    StringBuffer response = new StringBuffer();    while ((line = rd.readLine()) != null) {      response.append(line);      response.append('/r');    }    rd.close();    System.out.println(new JSONObject(response.toString()).toString(4));    return response.toString();  }  private static byte[] loadFile(File file) throws IOException {    InputStream is = new FileInputStream(file);    long length = file.length();    byte[] bytes = new byte[(int) length];    int offset = 0;    int numRead = 0;    while (offset < bytes.length        && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {      offset += numRead;    }    if (offset < bytes.length) {      is.close();      throw new IOException("Could not completely read file " + file.getName());    }    is.close();    return bytes;  }  // GBK编码转为UTF-8  private static String getUtf8String(String s) throws UnsupportedEncodingException  {   StringBuffer sb = new StringBuffer();   sb.append(s);   String xmlString = "";   String xmlUtf8 = ""; xmlString = new String(sb.toString().getBytes("GBK")); xmlUtf8 = URLEncoder.encode(xmlString , "GBK");   return URLDecoder.decode(xmlUtf8, "UTF-8");  }}

希望本文所述对大家java程序设计有所帮助。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表