IESM项目实训三
因百度语音没有提供实时语音识别-JAVA SDK,需要设计为一定时间间隔获取用户音频,识别结果。设计每一时间间隔需要合成一段简单音频以提醒用户,用户可以正常依次录入成绩,避免混乱。使用的依旧是百度语音技术中的语音合成,如果添加了语音识别的jar包,不需要再额外导入。
考虑合成的音频播放成功向前端返回响应后,才会执行后面的程序,避免连接超时,尽量将合成的语音文本设置简短,使用语音合成中的,短文本在线合成。
合成后播放音频额外添加了依赖:
<!--语音播放-->
<dependency>
<groupId>javazoom</groupId>
<artifactId>jlayer</artifactId>
<version>1.0.1</version>
</dependency>工具类定义如下:
public class VoiceCompose {
public static final String APP_ID = "26041279";
public static final String API_KEY = "SeVYDSPOfZxVDY3sSNQ9NzyK";
public static final String SECRET_KEY = "RtGRKVSnQBgSIIY7zCMfbHQzfAAgIGIi";
private static final AipSpeech aipSpeech = getAipSpeech();
//音频播放控制
private static Player player;
//初期测试将合成音频保存
private static String filename = "output.mp3";
//和语音识别相同
public static AipSpeech getAipSpeech() {
// 初始化一个AipSpeech
AipSpeech aipSpeech = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
// 可选:设置网络连接参数
aipSpeech.setConnectionTimeoutInMillis(2000000);
aipSpeech.setSocketTimeoutInMillis(60000000);
// 可选:设置代理服务器地址, http和socket二选一,或者均不设置
//aipSpeech.setHttpProxy("proxy_host", proxy_port); // 设置http代理
//aipSpeech.setSocketProxy("proxy_host", proxy_port); // 设置socket代理
// 可选:设置log4j日志输出格式,若不设置,则使用默认配置
// 也可以直接通过jvm启动参数设置此环境变量
// System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties");
return aipSpeech;
}
/**
* 将文字转为MP3文件,需联网,依靠百度语音合成
*/
public boolean getMP3ByText(String text){
player = null;
// 设置可选参数
HashMap<String, Object> options = new HashMap<>();
// 语速,取值0-9,默认为5中语速
options.put("spd", "5");
// 音调,取值0-9,默认为5中语调
options.put("pit", "5");
// 音量,取值0-15,默认为5中音量
options.put("vol", "5");
// 发音人选择, 0为女声,1为男声,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女
options.put("per", "4");
// 调用接口
// text 合成的文本,使用UTF-8编码。小于2048个中文字或者英文数字。(文本在百度服务器内转换为GBK后,长度必须小于4096字节)
// lang 固定值zh。语言选择,目前只有中英文混合模式,填写固定值zh
// ctp 客户端类型选择,web端填写固定值1
TtsResponse res = aipSpeech.synthesis(text, "zh", 1, options);
// 如果合成成功,下行数据为二进制语音文件,包含在data中。 如果合成出现错误,则会填充返回值到result中。
// 若请求错误,服务器将返回的JSON文本包含以下参数:
// error_code:错误码。
// error_msg:错误描述信息,帮助理解和解决发生的错误。
byte[] data = res.getData();
JSONObject res1 = res.getResult();
if (data != null) {
try {
Util.writeBytesToFileSystem(data, filename);
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
if (res1 != null) {
try {
System.out.println(res1.toString(2));
} catch (JSONException e) {
e.printStackTrace();
}
}
return true;
}
//合成音频播放,需要额外添加依赖
public void playMP3(){
try {
BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(filename));
// 需导入javazoom.jl.player.Player,下载地址http:///javalayer/sources/jlayer1.0.1.zip
player = new Player(buffer);
player.play();
} catch (Exception e) {
System.out.println(e);
}
}
//查询播放状态
public String playerStatus(){
if(player == null){
return "null";
}else if(player.isComplete()){
return "played";
}else{
return "playing";
}
}
//语音合成调用方式参照如下
public void compose(String text){
VoiceCompose voiceCompose = new VoiceCompose();
if(!voiceCompose.getMP3ByText(text)){
System.out.println("转换失败");
}else{
voiceCompose.playMP3();
}
}
}
















