随着互联网的高速发展,越来越多的需求需要把语音转换为文字(不是实时)
1、实现思路:
前端发给后端一个war文件,后端接收保存到本地,然后解析本地文件,获取语音内容返回文字信息。
前期准备:
1、 访问百度ai官网:百度AI开放平台-全球领先的人工智能服务平台
2、登录成功,选择产品,找到人工智能模块里的语音技术,如图:
2、按照操作指引完成1、 免费尝鲜,2、创建应用,3、调用服务,4、查看用量
1、免费尝鲜:
选择语音识别全选,免费领取:
2、创建应用
应用名称,选择接口技术、语音包名选择不需要会生成一条记录,里面包含
APP_ID,API_KEY,SECRET_KEY这是我们要进行百度转写的是要用的
准备工作已经完成,开始上干货
2、上代码:
引入依赖:
<dependency>
<groupId>com.baidu.aip</groupId>
<artifactId>java-sdk</artifactId>
<version>4.1.1</version>
</dependency>
从百度
方法一:(对接原生接口):
//语言转写 调用百度api
//上传wav包,转换为文件上传,调用白度接口,进行解析,返回一个对象,对象打点调result这个属性,然后返回前端。
@PostMapping(value = "/phoneticTranscription", produces = "text/html;charset=utf-8")
public String getphoneticTranscription(HttpServletRequest request,
@RequestParam("file") MultipartFile file) throws Exception {
if (!file.isEmpty()) {
// 构建上传文件的存放路径
String path = request.getServletContext().getRealPath("/upload/");
System.out.println("path = " + path);
// 获取上传的文件名称,并结合存放路径,构建新的文件名称
String filename = file.getOriginalFilename();
File filepath = new File(path, filename);
// 判断路径是否存在,不存在则新创建一个
if (!filepath.getParentFile().exists()) {
filepath.getParentFile().mkdirs();
}
String filePath = path + File.separator + filename;
// 将上传文件保存到目标文件目录
file.transferTo(new File(filePath));
//解析上传文件,返回数据给前端。
AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
client.setConnectionTimeoutInMillis(2000);
JSONObject res = client.asr(filePath, "wav", 16000, null);
System.out.println(res);
return res.getJSONArray("result").join(",");
}
return null;
}
方法二:(对接H5接口)
//语言转写 调用百度api
//按照道理来说,应该
@PostMapping(value = "/phoneticTranscription", produces = "text/html;charset=utf-8")
public String getyy(HttpServletRequest request,
@RequestParam("file") MultipartFile file) throws Exception {
byte[] pcmByteData = mp3Convert2pcm(file.getInputStream());
if (!file.isEmpty()) {
// 将上传文件保存到目标文件目录
AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
client.setConnectionTimeoutInMillis(2000);
org.json.JSONObject mav = client.asr(pcmByteData, "pcm", 16000, null);
System.out.println(mav);
return mav.getJSONArray("result").join(",");
}
return null;
}
/**
* MP3转换PCM
*
* @param inputStream MP3输入流
* @throws Exception
*/
public static byte[] mp3Convert2pcm(InputStream inputStream) throws Exception {
//转换PCM audioInputStream 数据
AudioInputStream audioInputStream = getPcmAudioInputStream(inputStream);
byte[] pcmBytes = IOUtils.toByteArray(audioInputStream);
return pcmBytes;
}
/**
* 获取PCM AudioInputStream 数据
*
* @param inputStream MP3输入流
* @return AudioInputStream PCM输入流
*/
private static AudioInputStream getPcmAudioInputStream(InputStream inputStream) {
AudioInputStream audioInputStream = null;
AudioFormat targetFormat = null;
try {
AudioInputStream in = null;
MpegAudioFileReader mp = new MpegAudioFileReader();
in = mp.getAudioInputStream(inputStream);
AudioFormat baseFormat = in.getFormat();
targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 16,
baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat.getSampleRate(), false);
audioInputStream = AudioSystem.getAudioInputStream(targetFormat, in);
} catch (Exception e) {
e.printStackTrace();
}
return audioInputStream;
}