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类型的数据回来,整个流程就这样。
文章写得很菜,纯当个人记录,很多细节没有上图,如有疑问可以留言探讨。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值