百度语音识别服务 —— 语音识别 REST API 开发笔记

在以前的项目中用到了百度语音识别服务,在这里做一个笔记。这里还是要和大家强调一下,最好的学习资料就是官网网站。我这里只是一个笔记,一方面整理了思路,另一方面方便以后我再次用到的时候可以快速回忆起来。

百度语音识别服务是什么?

百度语音识别服务能将语音文件(指定格式,不是所有格式都可以)识别成文本。语音识别我们都接触过,手机输入法里就有语音识别服务。

什么是百度语音识别的 REST API?

按照官网的说法

行业率先推出语音识别REST API,采用HTTP方式请求,可适用于任何平台的语音识别,给你最大的自由度!

简单说来,就是无须在开发者的项目中写入代码,或引入 jar 包 。 REST API 就是将音频文件转换成某种特定格式,通过 http 请求发送给百度语音识别的服务器,由百度语音识别的服务器进行语音识别,最后返回识别出的文本。

在我看来,她好在可以很方便的调用,我们自己不用去维护语音识别部分的代码,接入也十分简单,关键是她是免费的

使用的方式简单说来是
1、根据百度语音识别官方网站提供的
App ID 和 API Key 获取 accessToken。
2、根据上一步的 accessToken 连同其它请求参数一起向百度语音识别网关发出请求,获得识别的文本。

是不是觉得和微信公众平台的开发有点像?的确是这样的。微信公众平台的开发的确也是先获取 token,再通过 token 去请求其它数据。

集成步骤

本集成步骤参考了《Baidu_Voice_REST_API_Manual》。建议各位朋友先下载该资料学习。

第 1 步:注册成为百度开发者,创建应用,得到 API KeySecret Key

这一步非常简单,在官网上也有操作提示,这里就不多介绍了。
这里写图片描述

这里写图片描述

第 2 步:开通语音识别服务

开通语音识别服务的步骤也非常简单,大家可以自行操作或者参考官方文档。这里要注意:“ 语音识别” 服务初次开通成功后即可获得 50000 次/ 日 的在线调用次数配额。

如果我们每天调用的次数大于 50000 次,可以向百度申请提高次数,据说也是免费的,大赞。

以下的步骤就很关键了,因为我们要开始写代码了。

第 3 步:获取 Access Token

简而言之,就是向百度 OAuth2.0 授权服务的网关发出请求,将返回的数据(一般是字符串)进行解析,解析出我们想要的 Access Token。下面的图片截取自官网文档,写得非常详细了。

这里写图片描述

说明:其实就是使用 API KeySecret Key 和一个固定值的参数向百度 OAuth2.0 授权服务的网关发出 POST 请求,如果请求成功,则解析返回的字符串,从中解析出 access token 待用。

为了方便说明问题,下面代码没有应用良好格式,仅仅只是测试的方法,不建议直接应用于生产环境。

本例使用 HttpClient 框架发送 post 请求,HttpClient 的 Gradle 依赖为:

compile "org.apache.httpcomponents:httpclient:4.5.2"

示例代码:

/*** 获取 token,推荐用 POST 方法*/
@Test
public void test01(){try {CloseableHttpClient httpClient = HttpClients.createDefault();HttpPost httpPost = new HttpPost("https://openapi.baidu.com/oauth/2.0/token");List<NameValuePair> nvps = new ArrayList<>();nvps.add(new BasicNameValuePair("grant_type","client_credentials"));nvps.add(new BasicNameValuePair("client_id",apiKey));nvps.add(new BasicNameValuePair("client_secret",secretKey));httpPost.setEntity(new UrlEncodedFormEntity(nvps));ResponseHandler<String> responseHandler = new ResponseHandler(){@Overridepublic String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {int status = response.getStatusLine().getStatusCode();if (status >= 200 && status < 300) {HttpEntity entity = response.getEntity();try {return entity != null ? EntityUtils.toString(entity) : null;} catch (ParseException ex) {throw new ClientProtocolException(ex);}} else {throw new ClientProtocolException("Unexpected response status: " + status);}}};String responseBody = httpClient.execute(httpPost,responseHandler);System.out.println(responseBody);} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}
}

返回数据:

{"access_token":"24.463f2a9f7ce6721fe4d15568f812c086.2592000.1469627568.282335-7038695","session_key":"9mzdDxLM148MA1QmcNNrxGfLYBU9VokNbUY\/8WsJ1r4rUSev1bjP9GTKP6L6SVDnjx4BZxE5ZpJoqztA2K7O0MM9l0Z4","scope":"public audio_voice_assistant_get wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian","refresh_token":"25.f77abdb8f638404747dd969615c7b557.315360000.1782395568.282335-7038695","session_secret":"3efb3872a362beacab28879eed85497b","expires_in":2592000}

格式化以后:
这里写图片描述

我们须要从中解析出 access_token , json 字符串解析的框架有很多 fastjson、Jackson、json-lib、gson,这里就不多做介绍了。

另外还是要说明一下,因为 access_token 的有效时间是 2592000 (秒),即 30 × 24 × 60 × 60 (秒), 30 天,所以没有必要每一次请求都去获取 access_token ,建议把 access_token 放在应用的缓存里,如果失效了,再去获取,可以提高应用的效率,这一点和微信公众平台开发是一样的。

第 4 步:根据 Access Token 调用语音识别接口(隐式发送)

说明:我们这里采用的是隐式发送,即不发送真实的音频文件,而是发送音频文件转换而成的字节数组。这里一定要看官网说明,严格调用,才会识别出理想的结果。难点是音频格式的转换。

我是看了官网说明文档和示例代码,经过反复调试才得以调用成功的。鉴于这里篇幅的限制,请大家先看官网说明文档,我这里就不复制了。

这里为了方便说明,先上示例代码,同样地该代码只是为了便于说明问题,不建议在生产环境中直接使用:

/*** 识别英文*/
@Test
public void test02(){recognize("voice_en.wav","en");
}

上面的测试方法调用了语音识别的方法,该方法传递两个参数,一个是文件的全路径,另一个是中文或者英文的参数。

下面

/*** 请求语音识别的时候使用*/private static final String speech_recognition_url = "http://vop.baidu.com/server_api";
private void recognize(String wavName,String language){File wavFile = new File(wavName);HttpPost httpPost = null;CloseableHttpResponse response = null;CloseableHttpClient httpClient = HttpClients.createDefault();httpPost = new HttpPost(speech_recognition_url);SpeechRecognitionRequestEntity requestEntity = new SpeechRecognitionRequestEntity();// 语音压缩的格式:请按照官网文档填写 pcm(不压缩)、wav、opus、speex、amr、x-flac 之一,不区分大小写requestEntity.setFormat("wav");// 声道数,仅支持单声道,请填写 1requestEntity.setChannel("1");// 采样率,支持 8000 或者 16000 (这个类型是 int ,不能设置为 String 类型,关于采样率如何转换,请见下文)requestEntity.setRate(16000);// todo 这里应判断 AccessToken 是否过期,处理异常,如果过期了,应该重新获取 accessTokenrequestEntity.setToken("24.463f2a9f7ce6721fe4d15568f812c086.2592000.1469627568.282335-7038695");// Cuid 貌似可以随意填写requestEntity.setCuid("goodluck");requestEntity.setLen(wavFile.length());// 官网说: speech 要传递真实的语音数据,需要进行 base64 编码// 重点关注:请见后面封装的方法,就是把一个文件转换成为指定格式的字节数组requestEntity.setSpeech(handlerWavFile(wavFile));// 语种选择,中文=zh、粤语=ct、英文=en,不区分大小写,默认中文requestEntity.setLan(language);// 关键点 1 :将请求参数转换为 json 格式String requestEntityJson = JSON.toJSONString(requestEntity);// 关键点 2 :封装 StringEntity ,为解决中文乱码问题,应该设置编码StringEntity entity = new StringEntity(requestEntityJson.toString(), "UTF-8");entity.setContentEncoding("UTF-8");// 关键点 3 :设置 StringEntity 的 ContentTypeentity.setContentType("application/json");httpPost.setEntity(entity);ResponseHandler<String> responseHandler = new ResponseHandler<String>() {@Overridepublic String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {String resData = null;int statusCode = response.getStatusLine().getStatusCode();if (statusCode >= 200 && statusCode < 300) {HttpEntity httpEntity = response.getEntity();resData = EntityUtils.toString(httpEntity,"utf-8");EntityUtils.consume(httpEntity);}return resData;}};try {String responseStr = httpClient.execute(httpPost,responseHandler);System.out.println(responseStr);} catch (IOException e) {e.printStackTrace();}
}

SpeechRecognitionRequestEntity 类(省略了 get 和 set 方法):

public class SpeechRecognitionRequestEntity {// 语音压缩的格式private String format;/*** 注意,采样率的数据类型一定是 int,不能是 String*/// 采样率,支持 8000 或者 16000,在我们的项目中,写 16000private int rate;// 声道数,仅支持单声道,请填写 1private String channel;// 开发者身份验证密钥private String token;// 用户 ID,推荐使用设备 mac 地址 手机 IMEI 等设备唯一性参数// todo 貌似可以随意填写,唯一即可private String cuid;/*** 注意:这里填写的是原始语音的长度,不是使用 base64 编码的语音长度*/// 原始语音长度,单位字节private long len;// 真实的语音数据,需要进行 base64 编码private String speech;// 语种选择,中文=zh、粤语=ct、英文=en,不区分大小写,默认中文private String lan;
}

这部分代码摘抄自官网示例代码:

private 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;
}

返回结果:

{"corpus_no":"6300874524819907792","err_msg":"success.","err_no":0,"result":["one day in the cage club got bad news, ","one day in the case club got bad news, ","one day in that case club got bad news, ","one day in the cage club got the bad news, ","one day in the case club got the bad news, "],"sn":"843115237281467036671"}

格式化以后:
这里写图片描述

以上介绍了代码如何编写。但是在开发中,我遇到了一个难题,要将音频文件转换成百度语音识别能够识别的格式。请看官方文档说明。

这里写图片描述

于是,为了测试,我使用格式工厂软件进行格式转化。以下是格式转换的参数。
这里写图片描述
很高兴的是,经过格式工厂软件转换以后的音频文件能够被百度语音识别 REST 服务识别,识别度还不错,这是令人兴奋的。

但是,我又遇到了另一个问题,在服务器上总不能每个从客户端传来的音频文件都用格式工厂转换吧。于是,我找到了 Linux 平台上一款很好用的软件 sox。使用 sox 命令进行格式转换的命令格式:

sox 原始文件名全路径 -r 16000 -c1 生成的文件名全路径

接下来,我又继续查找资料,在 Linux 上调用 Linux 平台上的服务可以使用Java 中的 Runtime 和 Process 类运行外部程序。
参考代码:

String[] cmdStrings = new String[] { "/usr/bin/sox", tempWavFileName, "-r", "16000", "-c1", soundFileName_16000 };
Process psProcess = Runtime.getRuntime().exec(cmdStrings);
psProcess.waitFor();

到这里,语音识别开发的难点都攻克了。现在总结下来,真的是收获了不少。在这里先做个记录,有些知识点的掌握我还不是很透彻,后续还要再完善一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23972.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派实现语音识别与语音合成——百度云语音识别API

本文采用百度云语音识别API接口&#xff0c;实现低于60s音频的语音识别&#xff0c;也可以用于合成文本长度小于1024字节的音频&#xff0c;此外采用snowboy离线语音唤醒引擎可实现离线语音唤醒&#xff0c;实现语音交互。基于本内容可实现语音控制小车&#xff0c;语音控制音箱…

项目:基于百度API智能语音家居控制系统

目录 开发平台/开发环境&#xff1a; windows 10、Linux、arm cortex A9(Exynos 4412)、ubuntu20.04、zigebee通信、摄像头外设、cortex-M0&#xff1b; 项目模块&#xff1a; 摄像头模块&#xff1b;qt界面及语音识别模块&#xff1b;qt客户端模块&#xff1b;服务器模块&am…

Python调用百度API进行语音识别

目录 1.作者介绍2.基于百度API的普通话识别2.1语音识别2.2百度API调用方法 3&#xff0e;实验3.1实验准备3.2实验结果 4.实验代码 1.作者介绍 高志翔&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2021级研究生 研究方向&#xff1a;机器视觉与人工智能 电…

百度语音识别API的简单应用

1. prepare 根据百度开发文档的提示可以知道&#xff0c;API仅能处理特定格式的语音文件。 由于底层识别使用的是pcm&#xff0c;因此推荐直接上传pcm文件。如果上传其它格式&#xff0c;会在服务器端转码成pcm&#xff0c;调用接口的耗时会增加。 语音识别仅支持以下格式 &am…

什么是CatGPT-使用效果如何-

个人使用效果&#xff0c;评分优&#xff0c;足以满足教学和填表。 程序媛借助CatGPT&#xff08;ChatGPT更佳&#xff09;&#xff0c;基本上可以秒杀不用此类工具的程序猿&#xff08;男&#xff09;&#xff01;&#xff01;&#xff01; 问&#xff1a;为什么使用AIGC能大幅…

OpenAI ChatGPT3.5 completion API 入门指南

官方介绍 ChatGPT 由 OpenAI 最先进的语言模型 gpt-3.5-turbo 提供支持。 使用 OpenAI API&#xff0c;您可以使用 GPT-3.5-turbo 构建自己的程序来做一些如下的事情&#xff1a; 起草电子邮件或其他书面文件编写 Python 代码回答关于一组文档的问题创建对话代理程序为你的软件…

英语二-电子邮件邀请短文写作

1. 邮件模板 Dear 邀请人, Hope you have a great day. I am writing this email to invite you to attend 主题. Please kindly find the following information for your reference: Time: 时间 Address: 地点 We hope that nothing will prevent you from coming, as…

怎样收智商税

智商税的历史源远流长&#xff0c;史上最著名的案例&#xff0c;是 1313 年起天主教会开始发售的“赎罪券”&#xff1a;教皇宣称教徒购买此券&#xff0c;可以赦免罪罚&#xff0c;其宣传是“金币投进柜子当啷一响时&#xff0c;灵魂就可以升天堂了”。此案例诠释了智商税的几…

AIGC周报|让AI来画《海贼王》;苹果限制员工使用ChatGPT;李彦宏:不担心大模型会让工作消失

AIGC&#xff08;AI Generated Content&#xff09;即人工智能生成内容。近期爆火的 AI 聊天机器人 ChatGPT&#xff0c;以及 DallE 2、Stable Diffusion 等文生图模型&#xff0c;都属于 AIGC 的典型案例&#xff0c;它们通过借鉴现有的、人类创造的内容来快速完成内容创作。 …

谷歌正式开放智能 AI 机器人 Bard 迎战 ChatGPT,附申请教程

随着 ChatGPT 掀起了 AI 时代的浪潮之后&#xff0c;微软必应 Bing Chat 机器人、Office 以及百度的“文心一言”等都已经离开实验室&#xff0c;正式在公众的赛道上比拼了。3月21日周二&#xff0c;美国科技巨头谷歌公司推出了 AI 聊天机器人 Bard 的测试版本&#xff0c;以期…

吴恩达 ChatGPT Prompt Engineering for Developers 系列课程笔记--01 Introduction

01课程介绍Introduction 1) 两种LLM(Large Language Models) Base LLM&#xff1a;根据训练数据自动预测下一个单词。例如&#xff1a;给定"Once upon a time, there was a unicorn"&#xff0c;LLM会自动生成下面的文章"that lived in a magical forrest with…

计算机考研复试面试系列 计算机专业英语篇

计算机考研复试面试系列 计算机专业英语篇 在复习过程中&#xff0c;我用心查阅并整理了在考研复试面试中可能问到的大部分问题&#xff0c;并分点整理了答案&#xff0c;可以直接理解背诵并加上自己的语言润色!极力推荐打印下来看&#xff0c;效率更高&#xff01; 此系列一共…

AI时代的三类人:探索掌握AIGC,引领未来的人才之路

&#xff08;本文阅读时间&#xff1a;6 分钟&#xff09; 1 AI时代&#xff1a;ChatGPT引领AIGC技术革命 对于那些热衷于探索新技术的小伙伴而言&#xff0c;ChatGPT早已超越了抽象的概念&#xff0c;我们对其能力已有所了解。那么&#xff0c;ChatGPT究竟能够做些什么呢&…

AGI 大模型创业时代的创业公司新形态:11 人的 Midjourney 不是偶然 | 同为开发绘画AI的团队,Midjourney是怎么取得今天的成就的呢?

同为开发绘画AI的团队,Midjourney是怎么取得今天的成就的呢? 目录 同为开发绘画AI的团队,Midjourney是怎么取得今天的成就的呢?</

Web开发课程实验(二):Servlet+DAO实现数据库基本交互

实验内容&#xff1a; 使用servletDAO实现基本数据库交互 具体要求 编写一个静态网页&#xff0c;网页命名&#xff1a;student.html 编写一个Servlet&#xff0c;命名&#xff1a;StudentServlet 创建hit数据库&#xff08;PostgreSQL或MySQL均可&#xff09;&#xff0c;其…

占有统治地位的Transformer究竟是什么

讲个有趣的小故事 我高二那年从乙班考入了甲班&#xff0c;对于那时的我 偏科英语最高只有108班级平均英语成绩125暴躁难为人女英语老师&#xff0c;使我上英语课时战战兢兢。英语老师很时尚&#xff0c;喜欢搞花里胡哨的词语让我们放松&#xff0c;也很尊重我虽然暴躁但维护着…

8 Surprising Things You Can Do With ChatGPT 你可以用 ChatGPT 做的 8 件令人惊讶的事情

If you’ve heard about ChatGPT and think it’s just a fancy chatbot, you might be underestimating the range of what it can do. Here are some surprising things you can do with ChatGPT, whether you want to write a resume or have it dungeon-master an epic rol…

千万别错过!C/C++实现经典围棋大战,秒杀挫败柯洁的AlphaGo

在现实生活中想下围棋就必须要有棋子和棋盘&#xff0c;但是棋子好携带&#xff0c;但棋盘携带的话就和不方便了&#xff0c;所以很多人突然有雅兴想下围棋但奈何没有棋盘&#xff0c;但是随着围棋软件的出现就很好的解决了这个问题了&#xff0c;它可以让你随时随地都能过把手…

又一次输了人机大战,柯洁反复说着这两个词......

一场27日在福州与“星阵”的对决让柯洁的名字再度与“人机大战”联系在一起&#xff0c;而尽管中盘告负的结果让他“深感无力”&#xff0c;但柯洁表示未来与人工智能的对阵仍是不可避免&#xff0c;他也希望尽早出台相应的规则&#xff0c;防止未来可能利用人工智能作弊的现象…

柯洁直播中为何大笑不止 围棋人胜AI重现曙光?

新浪体育2023/05/02 柯洁直播中开心不已 4月30日&#xff0c;柯洁在b站的直播中分享了人类棋手“偷袭”击败AI的棋谱&#xff0c;坦言如果在人机大战的时候知道这个bug的话&#xff0c;或许有赢的可能。 2016&#xff0c;2017两次人机大战后&#xff0c;人与人工智能在围棋上的…