VekouJava粵語(yǔ)語(yǔ)音合成系統(tǒng)
至于為什么叫Vekou,我也不知道,唯一想了一分鐘多的是用什么字母開(kāi)頭,i是蘋(píng)果,z和m、w都是微軟,k是相機(jī)和膠卷,d像狗,所以還是v 比較有型一點(diǎn),然后隨手就把后面幾個(gè)可以連在一起發(fā)音的字母敲出來(lái)了。Vekou讀作'vekau,項(xiàng)目進(jìn)行了一段時(shí)間以后才突然想起需要一個(gè)比較像樣的名,一開(kāi)始建eclipse項(xiàng)目名用的還是speech synthesis。
Vekou目前雖然發(fā)音質(zhì)量不是相當(dāng)好,但基本上還可以工作了。你可以給一個(gè)String讓它發(fā)音,也可以給一個(gè)txt文檔讓它發(fā)音,當(dāng)然你也可以讓程序給你生成一個(gè)語(yǔ)音文件。0.0.4版的功能詳細(xì)的功能說(shuō)明如下:
1. String發(fā)音
2. txt文檔文件發(fā)音,txt文檔編碼自動(dòng)檢測(cè)
3. 語(yǔ)音文件生成
4. 粵語(yǔ)口語(yǔ)轉(zhuǎn)換發(fā)音
5. time scaling(未實(shí)現(xiàn))
6. pitch scaling(未實(shí)現(xiàn))
7. 繁簡(jiǎn)支持
8. 語(yǔ)音庫(kù)自定義
9. 詞典自定義
10. 口語(yǔ)字典自定義
Vekou的誕生離不開(kāi)Ekho(余音)的支持,Vekou的語(yǔ)音庫(kù)以及初始詞典全部來(lái)自于它,還有基于中科院的imdict 智能詞典所采用的智能中文分詞程序,Vekou的底層使用到中文分詞。
你可以很簡(jiǎn)單的使用它,初次嘗試的時(shí)候你可以建立一個(gè)如下的 Test.java文件來(lái)測(cè)試:
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.lib.speech.engine.Engine;
import org.lib.speech.engine.SpeechEngine;
import org.lib.speech.process.DefaultStreamProcess;
import org.lib.speech.process.ProcessCenter;
public class Test {
public static void main(String[] args) {
// 建造一個(gè)流處理器,參數(shù)設(shè)置是否重新讀取字典文件
ProcessCenter pc = new DefaultStreamProcess(true);
// 建立一個(gè)語(yǔ)音引擎,第二個(gè)參數(shù)設(shè)置是否轉(zhuǎn)換為粵語(yǔ)口語(yǔ)發(fā)音
Engine engine = new SpeechEngine(pc, true);
// 任何一個(gè)String作為你想要它發(fā)音的句子
String sentences = "你可以在這里嘗試任何一個(gè)句子,看看它是如何發(fā)音的。";
// 第一種方法:直接要它發(fā)音
engine.getPronounces(sentences);
// 第二種方法:句子在一個(gè)txt文檔中,你要它把txt中的內(nèi)容讀出來(lái),第二個(gè)參數(shù)設(shè)置是否將文檔內(nèi)容輸出到控制臺(tái)顯示
try {
engine.getPronounces(new File("C:/a.txt"), false);
} catch (IOException e) {
e.printStackTrace();
}
// 第三種方法:把發(fā)音保存在一個(gè).au的聲音文件中,目前只支持保存到這種文件,當(dāng)然你也可以自己擴(kuò)展
try {
engine.getPronouncesFile(sentences, new File(
"C:/a.au"));
} catch (IOException e) {
e.printStackTrace();
}
// 另外,如果你想獲得初始的發(fā)音素材,可以這樣顯示到控制臺(tái)
List<Object[]> list = engine.getPronounceElements(sentences);
Iterator<Object[]> iter = list.iterator();
while (iter.hasNext()) {
Object[] obj = iter.next();
if (obj[0] instanceof File) {
for (int i = 0; i < obj.length; i++) {
File file = (File) obj[i];
System.out.print(file.getName() + " ");
}
} else {
for (int i = 0; i < obj.length; i++) {
System.out.print(obj[i] + " ");
}
}
System.out.println();
}
}
}
