失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > java 调用科大讯飞语音听写和语音合成jdk

java 调用科大讯飞语音听写和语音合成jdk

时间:2020-09-24 21:12:09

相关推荐

java 调用科大讯飞语音听写和语音合成jdk

首先需要去科大讯飞开放云平台注册账号,添加一个应用,并领取免费的语音听写和语音合成的免费使用权限,拿到appId(用于后续使用)

然后下载语音听写对应的开发demo包(语音听写和语音合成用的jar包一样的,只要下载一份即可),如下图:

解压后把2个jar包和对应的库文件(windows是dll库文件,linux是so库文件)放到工程中如下图:

下面开始上代码,首先是语音听写,传入的参数是MultipartFile,格式必须按照讯飞规定的格式(sdk目前支持的格式是 pcm 和 wav 格式、音频采样率要是 16k 或者 8k、采样精度16 位、单声道音频) :

import com.iflytek.cloud.speech.*;import com.wzm.voicecalc.entity.WordsJson;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.json.JSONObject;import org.springframework.web.multipart.MultipartFile;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class IatTool {private static Logger LOGGER = LoggerFactory.getLogger(IatTool.class);private StringBuilder curRet;private SpeechRecognizer recognizer;private Object lock = new Object();public IatTool(String appId){LOGGER.info("------Speech Utility init iat------");SpeechUtility.createUtility(SpeechConstant.APPID + "=" + appId);}public String RecognizePcmfileByte(MultipartFile audioFile) {curRet = new StringBuilder();try {if (recognizer == null) {recognizer = SpeechRecognizer.createRecognizer();recognizer.setParameter(SpeechConstant.AUDIO_SOURCE, "-1");recognizer.setParameter( SpeechConstant.RESULT_TYPE, "plain" );}recognizer.startListening(recListener);byte[] buffer = audioFile.getBytes();if (buffer == null || buffer.length == 0) {LOGGER.error("no audio avaible!");recognizer.cancel();} else {int lenRead = buffer.length;recognizer.writeAudio( buffer, 0, lenRead );recognizer.stopListening();synchronized (lock) {lock.wait();//主线程等待}return curRet.toString();}} catch (Exception e) {e.printStackTrace();}return null;}private RecognizerListener recListener = new RecognizerListener() {@Overridepublic void onBeginOfSpeech() {LOGGER.info( "onBeginOfSpeech enter" );}@Overridepublic void onEndOfSpeech() {LOGGER.info( "onEndOfSpeech enter" );}/*** 获取听写结果*/@Overridepublic void onResult(RecognizerResult results, boolean islast) {LOGGER.info( "onResult enter" );String text = results.getResultString();curRet.append(text);if( islast ) {synchronized (lock) {lock.notify();//子线程唤醒}}}@Overridepublic void onVolumeChanged(int volume) {LOGGER.info( "onVolumeChanged volume=" + volume);}@Overridepublic void onError(SpeechError error) {LOGGER.error( "onError enter" );if (null != error) {LOGGER.error("onError Code:" + error.getErrorCode() + "," + error.getErrorDescription(true));}}@Overridepublic void onEvent(int eventType, int arg1, int agr2, String msg) {LOGGER.info( "onEvent enter" );//以下代码用于调试,如果出现问题可以将sid提供给讯飞开发者,用于问题定位排查/*if(eventType == SpeechEvent.EVENT_SESSION_ID) {DebugLog.Log("sid=="+msg);}*/}};}

然后是语音合成:

import com.iflytek.cloud.speech.*;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.File;import java.util.*;public class TtsTool {private static Logger LOGGER = LoggerFactory.getLogger(TtsTool.class);private Object lock = new Object();// 语音合成对象private SpeechSynthesizer mTts;private String ttsPcmDir;public TtsTool(String appId, String ttsPcmDir) {LOGGER.info("------Speech Utility init tts------");this.ttsPcmDir = ttsPcmDir;SpeechUtility.createUtility(SpeechConstant.APPID + "=" + appId);// 初始化合成对象mTts = SpeechSynthesizer.createSynthesizer();if (mTts != null) {// 设置发音人mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");} else {LOGGER.error("tts handler init fail");}}public String textToVoice(String text) {try {String pcmPath = ttsPcmDir + File.separator + UUID.randomUUID() + ".pcm";// 设置合成音频保存位置(可自定义保存位置),默认不保存mTts.synthesizeToUri(text, pcmPath, mSynListener);synchronized (lock) {lock.wait();}return pcmPath;} catch (Exception e) {LOGGER.error("textToVoice get exception:" + e.getMessage());e.printStackTrace();}return null;}/*** 合成监听器*/SynthesizeToUriListener mSynListener = new SynthesizeToUriListener() {public void onBufferProgress(int progress) {LOGGER.info("*************合成进度*************" + progress);}public void onSynthesizeCompleted(String uri, SpeechError error) {if (error == null) {LOGGER.info("*************合成成功*************");LOGGER.info("合成音频生成路径:" + uri);} else {LOGGER.info("******合成失败*******" + error.getErrorCode()+ "*************");}synchronized (lock) {LOGGER.info("通知合成成功");lock.notify();}}@Overridepublic void onEvent(int eventType, int arg1, int arg2, int arg3, Object obj1, Object obj2) {}};}

语音合成的结果直接保存成pcm文件。

希望文章对大家有帮助。

如果觉得《java 调用科大讯飞语音听写和语音合成jdk》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。