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接入百度语音识别的主要内容,如果未能解决你的问题,请参考以下文章

接入百度语音SDK的步骤

[专栏作家]百度语音识别接入Eclipse+Unity3D

关于几个主流语音SDK的接入问题

Unity 实战项目 ☀️| Unity接入 百度语音识别 SDK!一篇文章搞定在Unity中实现语音识别!(万字完整教程)

Android 百度语音合成 (含离线在线API合成方式,详细步骤+源码)

Android 百度语音合成 (含离线在线API合成方式,详细步骤+源码)