使用 开源库进行语音合成
- MaryTTS,主要面向使用西文的语音合成。
- 最新版
5.1.2
,支持德语
,西班牙语
,美式英语
,法语
,意大利语
,瑞典语
,俄语
,土耳其语
和泰卢固语
的语音合成。- 本记录使用的是
5.1
版- 最新版的运行环境是
jdk7+
,而5.1
版则是jdk6
也行
##项目需求:
- 能使用
java
进行本地的文本转语音的合成,不依赖网络(类似讯飞在线服务的方式)。 - 能支持英法德主要这三种西文的语音合成
- 最好是开源的解决方案
综上所述,最后找到的就这个开源库,但是我在阅读如何使用的时候,由于蹩脚的英语,遇到了几个坑,最好好在还是解决了如何使用这个燃眉之急,所以这里就做个记录。
##使用步骤 ####下载
- 因为我用的是
5.1
版的,所以在github
上的relese
标签中,下载相应的版本的源代码。 - 下载语音文件,打开源码中的
bin
目录,执行marytts-component-installer
脚本,linux或osx执行sh结尾的,win执行bat结尾的。这个shell打开了下载语言和语音工具软件。展开的界面中,左边是语言,右边是语音。 - 语音文件有两种,一种是
hsmm
格式的,它的大小在1~2M左右,还一种是unit-selection
格式,它的大小会在100M以上。具体的使用方法下面会展开
####配置环境
- 项目依赖的jar:
- maryTTS 的jar包极其依赖
- 语言包
- 支持该语言的语音包
- 项目结构搭建
- 拷贝下载的
lib
目录作为其项目的环境依赖,如果通过工具下载额外的语言和语音文件,其也会自动打包成jar格式的文件并自动保存到lib
下。 lib
的目录结构一般就这样- 对于
unit-selection
,可以查看下lib
下,是否存在Voices
的文件夹,如果有的话需要配置环境变量mary.base
指向lib
的父文件夹
####代码运行
- 语音的合成是调用
MaryInterface
接口进行功能的使用。一般本地使用的话,使用LocalMaryInterface
实现类。 MaryInterface
可用于指定声音文件,或则根据语言自动加载相应的声音文件。- 具体代码查考
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; } }