真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

語音合成java代碼,語音合成是怎么做的

在java程序中加入語音功能,例如給段字符串“A101”,就能發(fā)出聲音,請(qǐng)大家?guī)蛶兔Γx謝

為應(yīng)用程序加上語音能力有什么好處呢?粗略地講,是為了趣味,它適合所有注重趣味的應(yīng)用,比如游戲。當(dāng)然,從更嚴(yán)肅的角度來講,它還涉及到應(yīng)用的可用性問題。注意,這里我考慮的不僅是可視化界面固有的不足,而且還有這樣一些情形:一些時(shí)候,讓雙眼離開當(dāng)前的工作很不方便,甚至是不合法的。比如,假設(shè)有一個(gè)帶語音功能的瀏覽器,你就可以在外出散步或開車上班的同時(shí),用聽的方式瀏覽自己喜愛的網(wǎng)站。從目前來看,郵件閱讀器或許是語音技術(shù)更實(shí)際的應(yīng)用,在JavaMail API的幫助下,這一切已經(jīng)可能。郵件閱讀器可以定期地檢查收件箱,然后用語音“You have new mail, would you like me to read it to you?”引起你的注意。按照類似的思路,我們還可以考慮一個(gè)帶語音功能的提醒器,把它連接到一個(gè)日歷應(yīng)用:它會(huì)及時(shí)地提醒你“Don't forget your meeting with the boss in 10 minutes!”。 也許你已經(jīng)被這些主意吸引,或者有了自己更好的主意,現(xiàn)在讓我們繼續(xù)。首先我將介紹如何啟用本文提供的語音引擎,這樣,如果你認(rèn)為語音引擎的實(shí)現(xiàn)細(xì)節(jié)過于復(fù)雜,就可以直接使用它而忽略其實(shí)現(xiàn)細(xì)節(jié)。

創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括碭山網(wǎng)站建設(shè)、碭山網(wǎng)站制作、碭山網(wǎng)頁制作以及碭山網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,碭山網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到碭山省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

一、試用語音引擎 要使用這個(gè)語音引擎,你必須在CLASSPATH中加入本文提供的javatalk.jar文件,然后從命令行運(yùn)行(或者從Java程序調(diào)用)com.lotontech.speech.Talker類。如果從命令行運(yùn)行,則命令為: java com.lotontech.speech.Talker "h|e|l|oo" 如果從Java程序調(diào)用,則代碼為: com.lotontech.speech.Talker talker=new com.lotontech.speech.Talker(); talker.sayPhoneWord("h|e|l|oo"); 現(xiàn)在,對(duì)于在命令行上(或者調(diào)用sayPhoneWord()方法時(shí))提供的“h|e|l|oo”字符串,你或許有所不解。下面我就來解釋一下。 語音引擎的工作原理是把細(xì)小的聲音樣本連接起來,每一個(gè)樣本都是人的語言發(fā)音(英語)的一個(gè)最小單位。這些聲音樣本稱為音素(allophone)。每一個(gè)因素對(duì)應(yīng)一個(gè)、二個(gè)或者三個(gè)字母。從前面“hello”的語音表示可以看出,一些字母組合的發(fā)音顯而易見,還有一些卻不是很明顯: h -- 讀音顯而易見 e -- 讀音顯而易見 l -- 讀音顯而易見,但注意兩個(gè)“l(fā)”被簡縮成了一個(gè)“l(fā)”。 OO -- 應(yīng)該讀作“hello”中的讀音,不應(yīng)讀作“bot”、“too”中的讀音。 下面是一個(gè)有效音素的清單: a : 如cat b : 如cab c : 如cat d : 如dot e : 如bet f : 如frog g : 如frog h : 如hog i : 如pig j : 如jig k : 如keg l : 如leg m : 如met n : 如begin o : 如not p : 如pot r : 如rot s : 如sat t : 如sat u : 如put v : 如have w : 如wet y : 如yet z : 如zoo aa : 如fake ay : 如hay ee : 如bee ii : 如high oo : 如go bb : b的變化形式,重音不同 dd : d的變化形式,重音不同 ggg : g的變化形式,重音不同 hh : h的變化形式,重音不同 ll : l的變化形式,重音不同 nn : n的變化形式,重音不同 rr : r的變化形式,重音不同 tt : t的變化形式,重音不同 yy : y的變化形式,重音不同 ar : 如car aer : 如care ch : 如which ck : 如check ear : 如beer er : 如later err : 如later (長音) ng : 如feeding or : 如law ou : 如zoo ouu : 如zoo (長音) ow : 如cow oy : 如boy sh : 如shut th : 如thing dth : 如this uh : u 的變化形式 wh : 如where zh : 如Asian 人說話的時(shí)候,語音在整個(gè)句子之內(nèi)起落變化。語調(diào)變化使得語音更自然、更富有感染力,使得問句和陳述句能夠相互區(qū)別。請(qǐng)考慮下面兩個(gè)句子: It is fake -- f|aa|k Is it fake? -- f|AA|k 也許你已經(jīng)猜想到,提高語調(diào)的方法是使用大寫字母。 以上就是使用該軟件時(shí)你需要了解的東西。如果你對(duì)其后臺(tái)實(shí)現(xiàn)細(xì)節(jié)感興趣,請(qǐng)繼續(xù)閱讀。

二、實(shí)現(xiàn)語音引擎 語音引擎的實(shí)現(xiàn)只包括一個(gè)類,四個(gè)方法。它利用了J2SE 1.3包含的Java Sound API。在這里,我不準(zhǔn)備全面地介紹這個(gè)API,但你可以通過實(shí)例學(xué)習(xí)它的用法。Java Sound API并不是一個(gè)特別復(fù)雜的API,代碼中的注釋將告訴你必須了解的知識(shí)。 下面是Talker類的基本定義: package com.lotontech.speech; import javax.sound.sampled.*; import java.io.*; import java.util.*; import java.net.*; public class Talker { private SourceDataLine line=null; } 如果從命令行執(zhí)行Talker,下面的main()方法將作為入口點(diǎn)運(yùn)行。main()方法獲取第一個(gè)命令行參數(shù),然后把它傳遞給sayPhoneWord()方法: /* * 讀出在命令行中指定的表示讀音的字符串 */ public static void main(String args[]) { Talker player=new Talker(); if (args.length0) player.sayPhoneWord(args[0]); System.exit(0); }

sayPhoneWord()方法既可以通過上面的main()方法調(diào)用,也可以在Java程序中直接調(diào)用。從表面上看,sayPhoneWord()方法比較復(fù)雜,其實(shí)并非如此。實(shí)際上,它簡單地遍歷所有單詞的語音元素(在輸入字符串中語音元素以“|”分隔),通過一個(gè)聲音輸出通道一個(gè)元素一個(gè)元素地播放出來。為了讓聲音更自然一些,我把每一個(gè)聲音樣本的結(jié)尾和下一個(gè)聲音樣本的開頭合并了起來: /* * 讀出指定的語音字符串 */ public void sayPhoneWord(String word) { // 為上一個(gè)聲音構(gòu)造的模擬byte數(shù)組 byte[] previousSound=null; // 把輸入字符串分割成單獨(dú)的音素 StringTokenizer st=new StringTokenizer(word,"|",false); while (st.hasMoreTokens()) { // 為音素構(gòu)造相應(yīng)的文件名字 String thisPhoneFile=st.nextToken(); thisPhoneFile="/allophones/"+thisPhoneFile+".au"; // 從聲音文件讀取數(shù)據(jù) byte[] thisSound=getSound(thisPhoneFile); if (previousSound!=null) { // 如果可能的話,把前一個(gè)音素和當(dāng)前音素合并 int mergeCount=0; if (previousSound.length=500 thisSound.length=500) mergeCount=500; for (int i=0; i { previousSound[previousSound.length-mergeCount+i] =(byte)((previousSound[previousSound.length -mergeCount+i]+thisSound[i])/2); } // 播放前一個(gè)音素 playSound(previousSound); // 把經(jīng)過截短的當(dāng)前音素作為前一個(gè)音素 byte[] newSound=new byte[thisSound.length-mergeCount]; for (int ii=0; ii newSound[ii]=thisSound[ii+mergeCount]; previousSound=newSound; } else previousSound=thisSound; } // 播放最后一個(gè)音素,清理聲音通道 playSound(previousSound); drain(); } 在sayPhoneWord()的后面,你可以看到它調(diào)用playSound()輸出單個(gè)聲音樣本(即一個(gè)音素),然后調(diào)用drain()清理聲音通道。下面是playSound()的代碼: /* * 該方法播放一個(gè)聲音樣本 */ private void playSound(byte[] data) { if (data.length0) line.write(data, 0, data.length); } 下面是drain()的代碼: /* * 該方法清理聲音通道 */ private void drain() { if (line!=null) line.drain(); try {Thread.sleep(100);} catch (Exception e) {} }

現(xiàn)在回過頭來看sayPhoneWord(),這里還有一個(gè)方法我們沒有分析,即getSound()方法。 getSound()方法從一個(gè)au文件以字節(jié)數(shù)據(jù)的形式讀入預(yù)先錄制的聲音樣本。要了解讀取數(shù)據(jù)、轉(zhuǎn)換音頻格式、初始化聲音輸出行(SouceDataLine)以及構(gòu)造字節(jié)數(shù)據(jù)的詳細(xì)過程,請(qǐng)參考下面代碼中的注釋: /* * 該方法從文件讀取一個(gè)音素, * 并把它轉(zhuǎn)換成byte數(shù)組 */ private byte[] getSound(String fileName) { try { URL url=Talker.class.getResource(fileName); AudioInputStream stream = AudioSystem.getAudioInputStream(url); AudioFormat format = stream.getFormat(); // 把一個(gè)ALAW/ULAW聲音轉(zhuǎn)換成PCM以便回放 if ((format.getEncoding() == AudioFormat.Encoding.ULAW) || (format.getEncoding() == AudioFormat.Encoding.ALAW)) { AudioFormat tmpFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, format.getSampleRate(), format.getSampleSizeInBits() * 2, format.getChannels(), format.getFrameSize() * 2, format.getFrameRate(), true); stream = AudioSystem.getAudioInputStream(tmpFormat, stream); format = tmpFormat; } DataLine.Info info = new DataLine.Info( Clip.class, format, ((int) stream.getFrameLength() * format.getFrameSize())); if (line==null) { // 輸出線還沒有實(shí)例化 // 是否能夠找到合適的輸出線類型? DataLine.Info outInfo = new DataLine.Info(SourceDataLine.class, format); if (!AudioSystem.isLineSupported(outInfo)) { System.out.println("不支持匹配" + outInfo + "的輸出線"); throw new Exception("不支持匹配" + outInfo + "的輸出線"); } // 打開輸出線 line = (SourceDataLine) AudioSystem.getLine(outInfo); line.open(format, 50000); line.start(); } int frameSizeInBytes = format.getFrameSize(); int bufferLengthInFrames = line.getBufferSize() / 8; int bufferLengthInBytes = bufferLengthInFrames * frameSizeInBytes; byte[] data=new byte[bufferLengthInBytes]; // 讀取字節(jié)數(shù)據(jù),并計(jì)數(shù) int numBytesRead = 0; if ((numBytesRead = stream.read(data)) != -1) { int numBytesRemaining = numBytesRead; } // 把字節(jié)數(shù)據(jù)切割成合適的大小 byte[] newData=new byte[numBytesRead]; for (int i=0; i newData[i]=data[i]; return newData; } catch (Exception e) { return new byte[0]; } } 這就是全部的代碼,包括注釋在內(nèi),一個(gè)大約150行代碼的語音合成器。

三、文本-語音轉(zhuǎn)換 以語音元素的格式指定待朗讀的單詞似乎過于復(fù)雜,如果要構(gòu)造一個(gè)能夠朗讀文本(比如Web頁面或Email)的應(yīng)用,我們希望能夠直接指定原始的文本。 深入分析這個(gè)問題之后,我在本文后面的ZIP文件中提供了一個(gè)試驗(yàn)性的文本-語音轉(zhuǎn)換類。運(yùn)行這個(gè)類,它將顯示出分析結(jié)果。文本-語音轉(zhuǎn)換類可以從命令行執(zhí)行,如下所示: java com.lotontech.speech.Converter "hello there" 輸出結(jié)果類如: hello - h|e|l|oo there - dth|aer 如果運(yùn)行下面這個(gè)命令: java com.lotontech.speech.Converter "I like to read JavaWorld" 則輸出結(jié)果為: i - ii like - l|ii|k to - t|ouu read - r|ee|a|d java - j|a|v|a world - w|err|l|d 這個(gè)轉(zhuǎn)換類是如何工作的呢?實(shí)際上,我的方法相當(dāng)簡單,轉(zhuǎn)換過程就是以一定的次序應(yīng)用一組文本替換規(guī)則。例如對(duì)于單詞“ant”、“want”、“wanted”、“unwanted”和“unique”,則我們想要應(yīng)用的替換規(guī)則可能依次為: 用“|y|ou|n|ee|k|”替換“*unique*” 用“|w|o|n|t|”替換“*want*” 用“|a|”替換“*a*” 用“|e|”替換“*e*” 用“|d|”替換“*d*” 用“|n|”替換“*n*” 用“|u|”替換“*u*” 用“|t|”替換“*t*” 對(duì)于“unwanted”,輸出序列為: unwanted un[|w|o|n|t|]ed (規(guī)則2) [|u|][|n|][|w|o|n|t|][|e|][|d|] (規(guī)則4、5、6、7) u|n|w|o|n|t|e|d (刪除多余的符之后) 你將看到包含字母“wont”的單詞和包含字母“ant”的單詞以不同的方式發(fā)音,還將看到在特例規(guī)則的作用下,“unique”作為一個(gè)完整單詞優(yōu)先于其他規(guī)則,從而“unique”這個(gè)單詞讀作“y|ou...”而不是“u|n...”。

如何javascript實(shí)現(xiàn)語音合成

1) 在想出現(xiàn)播放器的地方插入一個(gè)層: div id="speech_player" name="speech_player"/div 層的id可以自己定。

2)把以下代碼放在/body前面:

script type="text/javascript" src="speech.w3cool.com/swf/speech.js,前面加上http://"/script

script type="text/javascript"

var _scid = "copytext"; // 希望朗讀的文章塊的id;

var _spid = "speech_player"; //顯示播放器的id;

_sp_bg = "0xCDDFF3"; //修改成想要的顏色

_sp_leftbg = "0x357DCE";

_sp_lefticon = "0xF2F2F2";

_sp_rightbg = "0x357DCE";

_sp_rightbghover = "0x4499EE";

_sp_righticon = "0xF2F2F2";

_sp_righticonhover = "0xFFFFFF";

_sp_text = "0x357DCE";

_sp_slider = "0x357DCE";

_sp_track = "0xFFFFFF";

_sp_border = "0xFFFFFF";

_sp_loader = "0x8EC2F4";

speaker();

/script

可以把speech.js文件下下來,放在項(xiàng)目文件夾下,然后引用,這樣可以不能連上互聯(lián)網(wǎng)的情況下使用

不過用這個(gè)要條件的,普通網(wǎng)站即PR5的只能共享32個(gè)合成服務(wù),即播放會(huì)受到限制,有排隊(duì)的規(guī)則,先到先合成聲音。PR=5的網(wǎng)站好像是免費(fèi)享有的。

java 接入微軟tts(語音合成) 文本內(nèi)容是怎么傳值的 最好有demo

修改LogWriter類的靜態(tài)域即可隨意切換輸出了。main方法中代碼不用改變。

代碼如下:

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

public class WriteOut {

public static void main(String[] args) throws IOException {

LogWriter.log("log info...");

}

}

class LogWriter {

// 可以寫作配置:true寫文件; false輸出控制臺(tái)

private static boolean fileLog = true;

private static String logFileName = "/tmp/log.log";

public static void log(String info) throws IOException {

OutputStream out = getOutputStream();

out.write(info.getBytes("utf-8"));

}

public static OutputStream getOutputStream() throws IOException {

if (fileLog) {

File file = new File(logFileName);

if (!file.exists())

file.createNewFile();

return new FileOutputStream(file);

} else {

return System.out;

}

}

}

用java編寫一個(gè)音頻合成的程序,需要將兩端音頻疊加,類似于配樂朗誦的那種

用Mixer的synchronize方法可以合成2個(gè)以上的音軌Line。

用Swing的滑動(dòng)條控制Line的音量大小即可。


新聞名稱:語音合成java代碼,語音合成是怎么做的
地址分享:http://weahome.cn/article/hoosig.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部