手把手教你用JAVA实现“语音识别”功能(声音转文字)标贝科技
手把手教你用JAVA实现“语音识别”功能(声音转文字)标贝科技
前言
什么是语音识别?
将自然语音转换为文本信息,本篇文章将介绍“一句话识别”(对60秒以内的语音进行实时转写识别)
一、内容太长不愿意看,直接使用系列
首先确认接口调用要求:
时长限制:60秒以内
支持音频格式:wav,pcm
音频采样率:8000Hz,16000Hz
位深:16bits
声道:单声道
确认无误后,直接执行 2.2获取权限+2.3.3完整代码示例
二、用JAVA调用标贝科技“语音识别”接口使用流程
2.1.环境准备
java
2.2.获取权限
2.1.1.登录
地址:https://ai.data-baker.com/#/?source=qaz123
(注:填写邀请码hi25d7,每日免费调用量还可以翻倍)
点击上方地址登录,支持短信、密码、微信三种登录方式。
2.1.2.创建应用
登录后,点击创建应用,填写相关信息(未实名认证只能创建一个应用)
(注:实名认证后可获得创建多个应用的权限)
进入应用,其中包含的技术产品有:语音识别、语音合成、声音复刻、声音转换
页面中功能主要包括:服务用量管理、购买服务量管理、开发者文档、授权管理、套餐管理
2.1.3.获取token
点击一句话识别--->授权管理--->显示--->获取APISecret--->(获取访问令牌token)
2.3.代码实现
2.3.1.获取token
/**
* 授权:需要在开放平台获取【https://ai.data-baker.com/#/?source=qaz123】
*/
private static final String clientId = "输入你的clientid";
private static final String clientSecret = "输入你的clientsecret";
/**
* 获取token的地址信息
*/
public static String tokenUrl = "https://openapi.data-baker.com/oauth/2.0/token?grant_type=client_credentials&client_secret=%s&client_id=%s";
public static String getAccessToken() {
String accessToken = "";
OkHttpClient client = new OkHttpClient();
// request 默认是get请求
String url = String.format(tokenUrl, clientSecret, clientId);
Request request = new Request.Builder().url(url).build();
JSONObject jsonObject;
try {
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
// 解析
String resultJson = response.body().string();
jsonObject = JSON.parseObject(resultJson);
accessToken = jsonObject.getString("access_token");
}
} catch (Exception e) {
e.printStackTrace();
}
return accessToken;
}
2.3.2.httpclient发送post请求
public static void doSpeechRecognition(String accessToken, File audioFile, String audioFormat, Integer sampleRate) {
try {
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/octet-stream");
FileInputStream in = new FileInputStream(audioFile);
byte[] fileByte = new byte[(int) audioFile.length()];
int realLen = in.read(fileByte);
//确保音频文件内容全部被读取
if (realLen == (int) audioFile.length()) {
RequestBody body = RequestBody.create(mediaType, fileByte);
//构造request
Request request = new Request.Builder()
.url(asrUrl)
.addHeader("access_token", accessToken)
.addHeader("audio_format", audioFormat)
.addHeader("sample_rate", String.valueOf(sampleRate))
.addHeader("domain", "common")
.method("POST", body)
.build();
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
JSONObject jsonObject = JSON.parseObject(response.body().string());
System.out.println("识别成功,识别结果:" + (jsonObject == null ? "" : jsonObject.getString("text")));
} else {
System.out.println("识别失败,错误信息:" + response.body().string());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
2.3.3.完整代码示例
package ......
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import okhttp3.*;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.FileInputStream;
/**
* (一句话)在线识别RESTFUL API接口调用示例
* 附:在线识别RESTFUL API文档 【https://www.data-baker.com/specs/file/asr_word_api_restful】
* <p>
* 注意:仅作为demo示例,失败重试、token过期重新获取、日志打印等优化工作需要开发者自行完成
*
* @author data-baker
*/
public class AsrRestApiDemo {
/**
* 授权:需要在开放平台获取【https://ai.data-baker.com/】
*/
private static final String clientId = "YOUR_CLIENT_ID";
private static final String clientSecret = "YOUR_CLIENT_SECRET";
/**
* 获取token的地址信息
*/
public static String tokenUrl = "https://openapi.data-baker.com/oauth/2.0/token?grant_type=client_credentials&client_secret=%s&client_id=%s";
/**
* 一句话识别API地址
*/
public static String asrUrl = "https://openapi.data-baker.com/asr/api";
/**
* 音频文件
*/
public static String audioPath = "/home/asr/16bit_16k.pcm";
/**
* 文件大小限制:开发者需注意服务端会校验音频时长不超过60S。demo作为示例,简化为只校验文件大小
*
* @param args
*/
public static Integer MAX_FILE_SIZE = 10 * 1024 * 1024;
public static void main(String[] args) {
String accessToken = getAccessToken();
if (StringUtils.isNotEmpty(accessToken)) {
File audioFile = new File(audioPath);
//一句话在线识别支持的音频长度在60S内,开发者需注意音频流的大小
if (audioFile.exists() && audioFile.length() < MAX_FILE_SIZE) {
//支持pcm和wav格式:如果是wav格式,audioFormat设置为"wav";如果是pcm格式,audioFormat设置为"pcm"
doSpeechRecognition(accessToken, audioFile, "pcm", 16000);
}
}
}
public static void doSpeechRecognition(String accessToken, File audioFile, String audioFormat, Integer sampleRate) {
try {
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/octet-stream");
FileInputStream in = new FileInputStream(audioFile);
byte[] fileByte = new byte[(int) audioFile.length()];
int realLen = in.read(fileByte);
//确保音频文件内容全部被读取
if (realLen == (int) audioFile.length()) {
RequestBody body = RequestBody.create(mediaType, fileByte);
//构造request
Request request = new Request.Builder()
.url(asrUrl)
.addHeader("access_token", accessToken)
.addHeader("audio_format", audioFormat)
.addHeader("sample_rate", String.valueOf(sampleRate))
.addHeader("domain", "common")
.method("POST", body)
.build();
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
JSONObject jsonObject = JSON.parseObject(response.body().string());
System.out.println("识别成功,识别结果:" + (jsonObject == null ? "" : jsonObject.getString("text")));
} else {
System.out.println("识别失败,错误信息:" + response.body().string());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static String getAccessToken() {
String accessToken = "";
OkHttpClient client = new OkHttpClient();
//request 默认是get请求
String url = String.format(tokenUrl, clientSecret, clientId);
Request request = new Request.Builder().url(url).build();
JSONObject jsonObject;
try {
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
//解析
String resultJson = response.body().string();
jsonObject = JSON.parseObject(resultJson);
accessToken = jsonObject.getString("access_token");
}
} catch (Exception e) {
e.printStackTrace();
}
return accessToken;
}
}
地址:https://ai.data-baker.com/#/?source=qaz123
(注:填写邀请码hi25d7,每日免费调用量还可以翻倍)
分类:
语音接口
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术