使用 MaryTTS 开源库进行语音合成

使用 MaryTTS 开源库进行语音合成

  • 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:

  2. maryTTS 的jar包极其依赖

  3. 语言包

  4. 支持该语言的语音包

  5. 项目结构搭建

  6. 拷贝下载的lib目录作为其项目的环境依赖,如果通过工具下载额外的语言和语音文件,其也会自动打包成jar格式的文件并自动保存到lib下。

  7. lib的目录结构一般就这样
    lib目录包含的文件

  8. 对于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;
    

    }
    }

你可能感兴趣的:(java,tts,语音合成,marytts)