Advertisement

文字转语音(语音合成技术)

阅读量:

在开发过程中有时会遇到需要用到语音提示功能的情况 下 采用前后端结合的方式实现语音辅助功能 比较而言 前端实现相对简便 并且适应性较强 但存在一些不足之处 如普通话发音欠佳 语调处理欠佳 等等 再者 调用百度的语音API能够提供更为专业的声音质量 如同专业的播音员一般 这种解决方案既保证了用户体验 又符合技术规范要求

一、前端js实现

样例:

在这里插入图片描述
复制代码
    <html>
    	<head>
    		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">	
    		<title>语音test</title>  
    		<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>  
    		<script>
    			$(function(){
    				
    				$("#btn").click(function(){
    					//主要代码
    					let msg = new SpeechSynthesisUtterance($("#try").val());
    				      /*console.log(msg)
    				       msg.rate = 2; //播放语速
    				       msg.pitch = 5; //音调高低
    				       msg.text = "播放文本 ";
    				       msg.volume = 1;// 播放音量
    				      */
    				    speechSynthesis.speak(msg);
    				});
    			});
    		</script> 
    	</head>  
    	<body>  
    		<h1>语音测试</h1>
    		<input id="try" value="这是测试的内容"/>
    		<button id="btn">播放文本内容</button>
    	</body>  
    </html>

二、后台调用百度语音API实现(java)

复制代码
    	调用百度api生成语音MP3文件,再使用Player播放,代码直接拷贝不能使用,还需导入百度语音SDK包和Player包。代用百度语音API需要在登录 百度智能云平台 创建应用,然后获得相关的密钥才能免费使用。
    	SDK下载地址:https://ai.baidu.com/file/EDF42F3DB3B4489FA1A88FD1E2BC5D74
    	Player下载地址:http://www.javazoom.net/javalayer/sources/jlayer1.0.1.zip
在这里插入图片描述
复制代码
    import com.baidu.aip.speech.AipSpeech;
    
    import com.baidu.aip.speech.TtsResponse;
    import com.baidu.aip.util.Util;
    import javazoom.jl.player.Player;
    import org.json.JSONObject;
     
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.HashMap;
     
    /** * 将文本上传至百度服务器,返回语音文件,如output.mp3,并播放MP3文件
     * SDK下载地址:https://ai.baidu.com/file/EDF42F3DB3B4489FA1A88FD1E2BC5D74
     */
    public class VoiceCompose {
    // 设置APPID/AK/SK
    // 百度AI开发平台的控制台中创建一个语音应用即可获得
    private static final String APP_ID = "18331512";
    private static final String API_KEY = "4Ikzi7CQ180eTGfgGoEL9Djt";
    private static final String SECRET_KEY = "dsmjGvaPPPpnNB5nWClTIyT0SWpZwqXN";
     
    private static final AipSpeech aipSpeech = getAipSpeech();
     
    private static String filename = "output.mp3";
     
    private static Player player;
     
    public static void main(String[] args) {
        VoiceCompose voiceCompose = new VoiceCompose();
        String text = "后台语音测试好麻烦";
        if(!voiceCompose.getMP3ByText(text)){
            System.out.println("转换失败");
        }else{
            voiceCompose.playMP3();
        }
    }
     
    private static AipSpeech getAipSpeech(){
        // 初始化一个AipSpeech
        AipSpeech aipSpeech = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
     
        // 可选:设置网络连接参数
        aipSpeech.setConnectionTimeoutInMillis(2000);
        aipSpeech.setSocketTimeoutInMillis(60000);
     
        // 可选:设置代理服务器地址, 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文件,需联网,依靠百度语音合成
     * @param text
     * @return 是否成功
     */
    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", "3");
     
        // 调用接口
        // 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) {
            System.out.println(res1.toString(2));
        }
     
        return true;
    }
     
    public void playMP3(){
        try {
            BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(filename));
    
            // 需导入javazoom.jl.player.Player,下载地址http://www.javazoom.net/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";
        }
    }
    }

全部评论 (0)

还没有任何评论哟~