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();
        }

    }
}