文章分为三个部分
1、百度语音测试使用(开发平台提供的音频)
2、Recorder.js捕获实际音频
3、后端语音转文字处理
使用原生JavaScript和jsp进行实现

1、百度语音测试使用(开发平台提供的音频)

,

2、Recorder.js捕获实际音频

1)下载地址:https://github.com/ubbcou/Recorder
GitHub上有具体使用教程,以下是个人应用的部分代码,点击一次开始录音,再次点击停止录音并将音频传送到后端

<html>
<body>
<input type="button" onclick="startRec()" value="录音转文字" width="50px">
</body>
</html>
<script>
var rec;
var flag=0;
function startRec(){
flag+=1;
if(flag%2==1){
rec=Recorder({type:"mp3",sampleRate:16000,bitRate:16,numChannels:1});//使用默认配
置,mp3格式
 
//打开麦克风授权获得相关资源
rec.open(function(){
//开始录音
rec.start();
},function(msg,isUserNotAllow){
//用户拒绝了权限或浏览器不支持
alert((isUserNotAllow?"用户拒绝了权限,":"")+"无法录音:"+msg);
});
}
 
if(flag%2==0){
//停止录音,得到了录音文件blob二进制对象,想干嘛就干嘛
rec.stop(function(blob,duration){
/*
blob文件对象,可以用FileReader读取出内容
,或者用FormData上传,本例直接上传二进制文件
,对于普通application/x-www-form-urlencoded表单上传
,请参考github里面的例子
*/
var form=new FormData();
form.append("upfile",blob,"recorder.mp3"); //和普通form表单并无二致,后端接收到upfile参数的文件,文件名为recorder.mp3
 
//直接用ajax上传
var xhr=new XMLHttpRequest();
xhr.open("POST","http://localhost:8080/语音处理程序路径");//这个假地址在控制台network中能看到请求数据和格式,请求结果无关紧要
xhr.onreadystatechange=function(){
if(xhr.readyState==4){
alert(xhr.status==200?"上传成功":"测试请先打开浏览器控制台,然后重新录音,在network选项卡里面就能看到上传请求数据和格式了");
document.getElementById("keyword").value=xhr.responseText;
}
}
xhr.send(form);
},function(msg){
alert("录音失败:"+msg);
});
 
}
 
};
function uploadRec(){
//停止录音,得到了录音文件blob二进制对象,想干嘛就干嘛
rec.stop(function(blob,duration){
/*
blob文件对象,可以用FileReader读取出内容
,或者用FormData上传,本例直接上传二进制文件
,对于普通application/x-www-form-urlencoded表单上传
,请参考github里面的例子
*/
var form=new FormData();
form.append("upfile",blob,"recorder.mp3"); //和普通form表单并无二致,后端接收到
upfile参数的文件,文件名为recorder.mp3
 
//直接用ajax上传
var xhr=new XMLHttpRequest();
xhr.open("POST","");//放后端语音处理程序的地址
xhr.onreadystatechange=function(){
if(xhr.readyState==4){
alert(xhr.status==200?"上传成功":"测试请先打开浏览器控制台,然后重新录音,在network选项卡里面就能看到上传请求数据和格式了");
document.getElementById("keyword").value=xhr.responseText;
}
}
xhr.send(form);
},function(msg){
alert("录音失败:"+msg);
});
};
function playRec(){
//停止录音,得到了录音文件blob二进制对象,想干嘛就干嘛
rec.stop(function(blob,duration){
var audio=document.createElement("audio");
audio.controls=true;
document.body.appendChild(audio);
 
//非常简单的就能拿到blob音频url
audio.src=URL.createObjectURL(blob);
audio.play();
},function(msg){
alert("录音失败:"+msg);
});
};
</script>

3、后端语音转文字处理

1)百度语音试别音频格式要求
在这里插入图片描述
2)ffmpeg安装
这里使用ffmepeg进行音频格式转换
i)安装
解压static版到文件夹
将bin目录的路径添加到Path中
在这里插入图片描述

ii)在命令符窗口中测试,出现如下内容即安装成功

在这里插入图片描述
3)后端语音处理代码

public class AudioServlet extends HttpServlet{
public void doPost(HttpServletRequest request,HttpServletResponse response) {
doGet(request,response);
}    Secret Key
 
public void doGet(HttpServletRequest request,HttpServletResponse response) {
final String APP_ID = "写自己申请到的AppID";
    final String API_KEY = "写自己申请到的API Key";
    final String SECRET_KEY = "写自己申请到的API Key";
DiskFileItemFactory factory=new DiskFileItemFactory();
String path = "E:\\audio";
factory.setRepository(new File(path));
factory.setSizeThreshold(1024 * 1024);
ServletFileUpload upload=new ServletFileUpload(factory);
try {
List<FileItem> items= (List<FileItem>) upload.parseRequest(request);
for(FileItem item:items){
if(item.isFormField()){
//System.out.println(item.getFieldName());
}else {
//System.out.println(item.getName());
//System.out.println(item.getString());
//byte[] data;
//data = Util.readFileByBytes(item.getString());//readFileByBytes仅为获取二进制数据示例
String value=item.getName();
int start = value.lastIndexOf("\\");
System.out.println("1");
String filename = value.substring(start + 1);
System.out.println("2");
try {
OutputStream out=new FileOutputStream(new File(path,filename));
InputStream in = item.getInputStream();
int length = 0;
byte[] buf = new byte[1024];
//System.out.println("获取上传文件的总共的容量:" + item.getSize());
while ((length = in.read(buf)) != -1) {
out.write(buf, 0, length);
}
in.close();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
String root="E:\\ProgramFiles\\ffmpeg\\bin";//填自己的ffmpeg的bin目录所在路径
String mp3Name="E:\\audio\\recorder.mp3";
String pcmName="E:\\audio\\test.pcm";
Runtime run=Runtime.getRuntime();
try {
                     Process p=run.exec(new File(root).getAbsolutePath()+"\\ffmpeg -y -i "+mp3Name+" -f s16le -ar 16000 -ac 1 -acodec pcm_s16le "+pcmName);//进程调用ffmpeg对音频进行格式转换
p.getOutputStream().close();  
            p.getInputStream().close();
            p.getErrorStream().close();
            p.waitFor();
            } catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
run.freeMemory();
}
AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
JSONObject asrRes2 = client.asr((pcmName), "pcm", 16000, null);
 
JSONArray result=asrRes2.getJSONArray("result");
try {
response.setCharacterEncoding("utf-8");
PrintWriter pw=response.getWriter();
String word=result.get(0).toString();
word=word.substring(0, word.length()-1);
pw.write(word);
} catch (IOException e) {
e.printStackTrace();
}
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
 
}
}

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐