博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用 MaryTTS 开源库进行语音合成
阅读量:6538 次
发布时间:2019-06-24

本文共 3249 字,大约阅读时间需要 10 分钟。

hot3.png

使用 开源库进行语音合成

  • MaryTTS,主要面向使用西文的语音合成。
  • 最新版5.1.2,支持 德语, 西班牙语 ,美式英语, 法语, 意大利语, 瑞典语, 俄语, 土耳其语泰卢固语 的语音合成。
  • 本记录使用的是5.1
  • 最新版的运行环境是jdk7+,而5.1版则是jdk6也行

##项目需求:

  1. 能使用java进行本地的文本转语音的合成,不依赖网络(类似讯飞在线服务的方式)。
  2. 能支持英法德主要这三种西文的语音合成
  3. 最好是开源的解决方案

综上所述,最后找到的就这个开源库,但是我在阅读如何使用的时候,由于蹩脚的英语,遇到了几个坑,最好好在还是解决了如何使用这个燃眉之急,所以这里就做个记录。

##使用步骤 ####下载

  1. 因为我用的是5.1版的,所以在github上的relese标签中,下载相应的版本的源代码。
  2. 下载语音文件,打开源码中的bin目录,执行marytts-component-installer脚本,linux或osx执行sh结尾的,win执行bat结尾的。这个shell打开了下载语言和语音工具软件。展开的界面中,左边是语言,右边是语音。语言和语音下载工具界面
  3. 语音文件有两种,一种是hsmm格式的,它的大小在1~2M左右,还一种是unit-selection格式,它的大小会在100M以上。具体的使用方法下面会展开

####配置环境

  1. 项目依赖的jar:
  • maryTTS 的jar包极其依赖
  • 语言包
  • 支持该语言的语音包
  1. 项目结构搭建
  • 拷贝下载的lib目录作为其项目的环境依赖,如果通过工具下载额外的语言和语音文件,其也会自动打包成jar格式的文件并自动保存到lib下。
  • lib的目录结构一般就这样 lib目录包含的文件
  • 对于unit-selection,可以查看下lib下,是否存在Voices的文件夹,如果有的话需要配置环境变量 mary.base 指向 lib的父文件夹

####代码运行

  1. 语音的合成是调用MaryInterface接口进行功能的使用。一般本地使用的话,使用LocalMaryInterface 实现类。
  2. MaryInterface 可用于指定声音文件,或则根据语言自动加载相应的声音文件。
  3. 具体代码查考demo.java的使用

package name.icoder.marytts;

import marytts.LocalMaryInterface; import marytts.MaryInterface; import marytts.exceptions.MaryConfigurationException; import marytts.exceptions.SynthesisException; import marytts.modules.synthesis.Voice; import marytts.util.data.audio.AudioPlayer;

import javax.sound.sampled.AudioInputStream; import java.util.Locale; import java.util.Set;

/**

  • Created by evilgod528 on 15/3/30. */ public class demo { private static MaryInterface marytts; private static AudioPlayer player; static { try { System.setProperty("mary.base","/Users/*****/Documents/build/idea/everyIT/maryTTS"); marytts = new LocalMaryInterface(); Set<String> voices = marytts.getAvailableVoices(); marytts.setVoice(voices.iterator().next());

    player = new AudioPlayer(); } catch (MaryConfigurationException e) {     e.printStackTrace(); }

    } //不能连续的播放声音 public static void main(String[] args) { //英语 marytts.setLocale(Locale.US); speakText("Good Morning"); //法语 // marytts.setLocale(Locale.FRENCH); // Voice voice = Voice.getVoice(Locale.FRENCH, new Voice.Gender("male")); // marytts.setVoice(voice.getName()); // marytts.setVoice("upmc-pierre-hsmm"); // System.out.println(marytts.getVoice()); // System.out.println(marytts.getVoice()); // // speakText("Bonjour"); //德语 // marytts.setLocale(Locale.GERMAN); // speakText("gutten Morgen"); }

    public static void speakText(String text){

    if(marytts==null){     throw new RuntimeException("声音合成器初始化失败,无法合成声音"); } try {     AudioInputStream audio = marytts.generateAudio(text);     player.setAudio(audio);     player.start();     player.join(); } catch (SynthesisException e) {     e.printStackTrace(); } catch (InterruptedException e) {     e.printStackTrace(); }

    } public static void speakText(AudioInputStream audio){ if(marytts==null){ throw new RuntimeException("声音合成器初始化失败,无法合成声音"); }else if (audio==null){ throw new RuntimeException("声音文件不存在"); } try { player.setAudio(audio); player.start(); player.join(); } catch (InterruptedException e) { e.printStackTrace(); } } public static AudioInputStream getTextVoice(String text){ AudioInputStream audio = null; if(marytts==null){ throw new RuntimeException("声音合成器初始化失败,无法合成声音"); } try { audio = marytts.generateAudio(text); } catch (SynthesisException e) { e.printStackTrace(); } return audio; } }

转载于:https://my.oschina.net/evilgod528/blog/396167

你可能感兴趣的文章
[AHOI2013]作业
查看>>
git push被忽略的文件 处理
查看>>
C#中用ILMerge将所有引用的DLL打成一个DLL文件
查看>>
PHP生成HTML静态页面
查看>>
Makefile 中:= ?= += =的区别【转】
查看>>
使用makecontext实现用户线程【转】
查看>>
Comet:基于 HTTP 长连接的“服务器推”技术
查看>>
BZOJ 2733: [HNOI2012]永无乡 启发式合并treap
查看>>
四种方法校验数组中是否包含某个指定的字符串
查看>>
29、Java并发性和多线程-非阻塞算法
查看>>
安装OpenResty开发环境
查看>>
第0课 从0开始
查看>>
hadoop无法启动DataNode问题
查看>>
java泛型中<?>和<T>区别
查看>>
这里是指推送通知跟NSNotification有区别:
查看>>
用户ID的代码生成
查看>>
win7经常出现“关闭xxxx前您必须关闭所有会话框”
查看>>
SNMP安全配置的两种方法(也可同一时候兼顾配置两种方法)
查看>>
MongoDB 自己定义函数
查看>>
Summary Day30
查看>>