javaAPI和android sdk接入百度语音识别
Posted TOPthemaster
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaAPI和android sdk接入百度语音识别相关的知识,希望对你有一定的参考价值。
最近由于一项目需求,需要实现上位机对下位机的语音控制,(嫌弃语音模块太贵,才想着做没有成本的方法实现),这里主要测试了两种调用百度语音识别API的方案,一种是基于SDK(这里测试使用android SDK),一种是通过java实现API调用。
先看下Android SDK的使用,下面是使用效果(不知道为什么我使用app按下录音时,录屏没有录进我说的话。。。。影响不大,就当我说了):
百度语音识别调用
然后是一些SDK的使用方式:
首先我们需要在自己的项目中导入百度AI下载Android sdk,即图中的core:
关于如何调用sdk中的功能,在官方的下载包中有明确的讲解,这里不展开说明,仅分享个人感受,这里我使用的是它sdk中的短语音识别:
下面的没有用过,应该是指唤醒功能什么的吧,在我自己的项目activity中继承这个类:
然后在按钮事件中调用其功能:
vocal_home.setOnTouchListener(new View.OnTouchListener()
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public boolean onTouch(View v, MotionEvent event)
if (event.getAction() == MotionEvent.ACTION_DOWN)
//更改为按下时
start();
// Toast.makeText(ActivityMiniRecog.this, "我正在听", Toast.LENGTH_LONG).show();
vocal_home.setBackgroundResource(R.drawable.shape2);
vocal_home.setText("正在识别(识别完成后再次点击发送)");
else if (event.getAction() == MotionEvent.ACTION_UP)
//改为抬起时的图片
vocal_home.setBackgroundResource(R.drawable.shape3);
vocal_home.setText("按下说话");
stop();
//Toast.makeText(ActivityMiniRecog.this, "", Toast.LENGTH_LONG).show();
// Toast.makeText(MainActivity.this, "松开:" + final_result, Toast.LENGTH_SHORT).show();
// mqtt.publishmessageplus("curtain_control", final_result);
try
Thread.sleep(10);
catch (InterruptedException e)
e.printStackTrace();
if (final_result.equals("打开窗帘。"))
mqtt.publishmessageplus("curtain_control", "\\"power\\":\\"right\\"");
else if (final_result.equals("关闭窗帘。"))
mqtt.publishmessageplus("curtain_control", "\\"power\\":\\"left\\"");
else if (final_result.equals("暂停。"))
mqtt.publishmessageplus("curtain_control", "\\"power\\":\\"off\\"");
return false;
);
由此实现了语音识别和记录,得到了数据,便可以做自己想做的事了,例如这里我是用来控制窗帘的运动的。
sdk中的东西太多了,如有需要可以深入探索,这里到此为止,然后是我在使用过程中遇到的一些问题:一个是sdk使用的是androidx,而我原来的项目使用的是android.support,导致我自己的项目发生冲突,这里我的解决方法是全更新使用Androidx库,毕竟新总胜于旧嘛。
然后是通过java 使用api调用百度语音识别,这里我采用了官网提供的pcm语音数据,没有做录音处理,就是懒。。。如下是识别结果:
然后贴下代码:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import netscape.javascript.JSObject;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
public class Baidu_vocal
public static void main(String[] args) throws IOException
final String APP_KEY = "GUb5H9oEQ6TBG9bEGbqglQlI";
final String SECRET_KEY = "Vr2AYu9C8nAmSdbufGhHuRs8hfyBFqTt";
final String FILENAME = "16k.pcm";
String CUID = "1234567JAVA";
final String FORMAT = FILENAME.substring(FILENAME.length() - 3);
final int RATE = 16000;
String URLd="http://vop.baidu.com/server_api";
int DEV_PID=1537;
String SCOPE="audio_voice_assistant_get";
String token="24.3787ab07a129cb6f7191d49db4b4680d.2592000.1620725159.282335-23943116";
String contentTypeStr = "audio/" + FORMAT + "; rate=" + RATE;
String url2 = URLd + "?cuid=" + URLEncoder.encode(CUID, "UTF-8") + "&dev_pid=" + DEV_PID + "&token=" + token;
byte[] content ;
File file = new File(FILENAME);
FileInputStream is = null;
try
is = new FileInputStream(file);
byte[] b = new byte[1024];
// 定义一个输出流存储接收到的数据
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// 开始接收数据
int len = 0;
while (true)
len = is.read(b);
if (len == -1)
// 数据读完
break;
byteArrayOutputStream.write(b, 0, len);
//音频转换的数据流
content=byteArrayOutputStream.toByteArray();
finally
if (is != null)
try
is.close();
catch (IOException e)
e.printStackTrace();
HttpURLConnection conn = (HttpURLConnection) new URL(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);
String result;
int responseCode = conn.getResponseCode();
InputStream inputStream = conn.getInputStream();
if (responseCode != 200)
System.err.println("http 请求返回的状态码错误,期望200, 当前是 " + responseCode);
if (responseCode == 401)
System.err.println("可能是appkey appSecret 填错");
System.err.println("response headers" + conn.getHeaderFields());
if (inputStream == null)
inputStream = conn.getErrorStream();
byte[] results = getInputStreamContent(inputStream);
result=new String(results);
JSONObject jsonObject = JSONObject.parseObject(result);
String out_put= jsonObject.getString("result");
File files = new File("result.txt");
FileWriter fo = new FileWriter(files);
fo.write(result);
fo.close();
System.out.println("Result also wrote into " + files.getAbsolutePath());
System.out.println("result:" + out_put);
public static byte[] getInputStreamContent(InputStream is) throws IOException
byte[] b = new byte[1024];
// 定义一个输出流存储接收到的数据
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// 开始接收数据
int len = 0;
while (true)
len = is.read(b);
if (len == -1)
// 数据读完
break;
byteArrayOutputStream.write(b, 0, len);
return byteArrayOutputStream.toByteArray();
这里流程懒得画图,大概说一下,首先你得保证你在百度AI上创建了自己的产品,如图:
官方提供了免费的额度,可以白嫖,创建完后,需要使用到所创建产品的三要素:
然后通过三要素先获取一边token(代码中没有做这一步,可以直接复制连接得到token),然后利用token post本地语音转码后的数据给它,它会返回json类型的数据回来,整个流程就这样。
文章写得很菜,纯当个人记录,很多细节没有上图,如有疑问可以留言探讨。
以上是关于javaAPI和android sdk接入百度语音识别的主要内容,如果未能解决你的问题,请参考以下文章
Unity 实战项目 ☀️| Unity接入 百度语音识别 SDK!一篇文章搞定在Unity中实现语音识别!(万字完整教程)