為應用程序加上語音能力有什么好處呢?粗略地講,是為了趣味,它適合所有注重趣味的應用,比如游戲。當然,從更嚴肅的角度來講,它還涉及到應用的可用性問題。注意,這里我考慮的不僅是可視化界面固有的不足,而且還有這樣一些情形:一些時候,讓雙眼離開當前的工作很不方便,甚至是不合法的。比如,假設有一個帶語音功能的瀏覽器,你就可以在外出散步或開車上班的同時,用聽的方式瀏覽自己喜愛的網(wǎng)站。從目前來看,郵件閱讀器或許是語音技術(shù)更實際的應用,在JavaMail API的幫助下,這一切已經(jīng)可能。郵件閱讀器可以定期地檢查收件箱,然后用語音“You have new mail, would you like me to read it to you?”引起你的注意。按照類似的思路,我們還可以考慮一個帶語音功能的提醒器,把它連接到一個日歷應用:它會及時地提醒你“Don't forget your meeting with the boss in 10 minutes!”。 也許你已經(jīng)被這些主意吸引,或者有了自己更好的主意,現(xiàn)在讓我們繼續(xù)。首先我將介紹如何啟用本文提供的語音引擎,這樣,如果你認為語音引擎的實現(xiàn)細節(jié)過于復雜,就可以直接使用它而忽略其實現(xiàn)細節(jié)。
建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡程序員、網(wǎng)頁設計師等,應用各種網(wǎng)絡程序開發(fā)技術(shù)和網(wǎng)頁設計技術(shù)配合操作的協(xié)同工作。創(chuàng)新互聯(lián)建站專業(yè)提供成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設,網(wǎng)頁設計,網(wǎng)站制作(企業(yè)站、成都響應式網(wǎng)站建設、電商門戶網(wǎng)站)等服務,從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗的提升,我們力求做到極致!
一、試用語音引擎 要使用這個語音引擎,你必須在CLASSPATH中加入本文提供的javatalk.jar文件,然后從命令行運行(或者從Java程序調(diào)用)com.lotontech.speech.Talker類。如果從命令行運行,則命令為: 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)在,對于在命令行上(或者調(diào)用sayPhoneWord()方法時)提供的“h|e|l|oo”字符串,你或許有所不解。下面我就來解釋一下。 語音引擎的工作原理是把細小的聲音樣本連接起來,每一個樣本都是人的語言發(fā)音(英語)的一個最小單位。這些聲音樣本稱為音素(allophone)。每一個因素對應一個、二個或者三個字母。從前面“hello”的語音表示可以看出,一些字母組合的發(fā)音顯而易見,還有一些卻不是很明顯: h -- 讀音顯而易見 e -- 讀音顯而易見 l -- 讀音顯而易見,但注意兩個“l(fā)”被簡縮成了一個“l(fā)”。 OO -- 應該讀作“hello”中的讀音,不應讀作“bot”、“too”中的讀音。 下面是一個有效音素的清單: 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 人說話的時候,語音在整個句子之內(nèi)起落變化。語調(diào)變化使得語音更自然、更富有感染力,使得問句和陳述句能夠相互區(qū)別。請考慮下面兩個句子: It is fake -- f|aa|k Is it fake? -- f|AA|k 也許你已經(jīng)猜想到,提高語調(diào)的方法是使用大寫字母。 以上就是使用該軟件時你需要了解的東西。如果你對其后臺實現(xiàn)細節(jié)感興趣,請繼續(xù)閱讀。
二、實現(xiàn)語音引擎 語音引擎的實現(xiàn)只包括一個類,四個方法。它利用了J2SE 1.3包含的Java Sound API。在這里,我不準備全面地介紹這個API,但你可以通過實例學習它的用法。Java Sound API并不是一個特別復雜的API,代碼中的注釋將告訴你必須了解的知識。 下面是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()方法將作為入口點運行。main()方法獲取第一個命令行參數(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()方法比較復雜,其實并非如此。實際上,它簡單地遍歷所有單詞的語音元素(在輸入字符串中語音元素以“|”分隔),通過一個聲音輸出通道一個元素一個元素地播放出來。為了讓聲音更自然一些,我把每一個聲音樣本的結(jié)尾和下一個聲音樣本的開頭合并了起來: /* * 讀出指定的語音字符串 */ public void sayPhoneWord(String word) { // 為上一個聲音構(gòu)造的模擬byte數(shù)組 byte[] previousSound=null; // 把輸入字符串分割成單獨的音素 StringTokenizer st=new StringTokenizer(word,"|",false); while (st.hasMoreTokens()) { // 為音素構(gòu)造相應的文件名字 String thisPhoneFile=st.nextToken(); thisPhoneFile="/allophones/"+thisPhoneFile+".au"; // 從聲音文件讀取數(shù)據(jù) byte[] thisSound=getSound(thisPhoneFile); if (previousSound!=null) { // 如果可能的話,把前一個音素和當前音素合并 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); } // 播放前一個音素 playSound(previousSound); // 把經(jīng)過截短的當前音素作為前一個音素 byte[] newSound=new byte[thisSound.length-mergeCount]; for (int ii=0; ii newSound[ii]=thisSound[ii+mergeCount]; previousSound=newSound; } else previousSound=thisSound; } // 播放最后一個音素,清理聲音通道 playSound(previousSound); drain(); } 在sayPhoneWord()的后面,你可以看到它調(diào)用playSound()輸出單個聲音樣本(即一個音素),然后調(diào)用drain()清理聲音通道。下面是playSound()的代碼: /* * 該方法播放一個聲音樣本 */ 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(),這里還有一個方法我們沒有分析,即getSound()方法。 getSound()方法從一個au文件以字節(jié)數(shù)據(jù)的形式讀入預先錄制的聲音樣本。要了解讀取數(shù)據(jù)、轉(zhuǎn)換音頻格式、初始化聲音輸出行(SouceDataLine)以及構(gòu)造字節(jié)數(shù)據(jù)的詳細過程,請參考下面代碼中的注釋: /* * 該方法從文件讀取一個音素, * 并把它轉(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(); // 把一個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) { // 輸出線還沒有實例化 // 是否能夠找到合適的輸出線類型? 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ù),并計數(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),一個大約150行代碼的語音合成器。
三、文本-語音轉(zhuǎn)換 以語音元素的格式指定待朗讀的單詞似乎過于復雜,如果要構(gòu)造一個能夠朗讀文本(比如Web頁面或Email)的應用,我們希望能夠直接指定原始的文本。 深入分析這個問題之后,我在本文后面的ZIP文件中提供了一個試驗性的文本-語音轉(zhuǎn)換類。運行這個類,它將顯示出分析結(jié)果。文本-語音轉(zhuǎn)換類可以從命令行執(zhí)行,如下所示: java com.lotontech.speech.Converter "hello there" 輸出結(jié)果類如: hello - h|e|l|oo there - dth|aer 如果運行下面這個命令: 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 這個轉(zhuǎn)換類是如何工作的呢?實際上,我的方法相當簡單,轉(zhuǎn)換過程就是以一定的次序應用一組文本替換規(guī)則。例如對于單詞“ant”、“want”、“wanted”、“unwanted”和“unique”,則我們想要應用的替換規(guī)則可能依次為: 用“|y|ou|n|ee|k|”替換“*unique*” 用“|w|o|n|t|”替換“*want*” 用“|a|”替換“*a*” 用“|e|”替換“*e*” 用“|d|”替換“*d*” 用“|n|”替換“*n*” 用“|u|”替換“*u*” 用“|t|”替換“*t*” 對于“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”作為一個完整單詞優(yōu)先于其他規(guī)則,從而“unique”這個單詞讀作“y|ou...”而不是“u|n...”。
用FreeTTS實現(xiàn)Java語音程序
1. Download FreeTTS:
2. 解壓后運行:D:\software\freetts-1.2\lib\jsapi.exe, 選擇agree.
3. 寫helloworld程序,語音讀出"MPLS alarm: link down":
import java.util.Locale;
import javax.speech.Central;
import javax.speech.EngineList;
import javax.speech.synthesis.Synthesizer;
import javax.speech.synthesis.SynthesizerModeDesc;
import javax.speech.synthesis.Voice;
public class HelloWorld {
public HelloWorld() {
}
public static void main(String args[]) {
try {
SynthesizerModeDesc desc = new SynthesizerModeDesc("FreeTTS en_US general synthesizer", "general",
Locale.US, null, null);
Synthesizer synthesizer = Central.createSynthesizer(desc);
if (synthesizer == null) {
System.exit(1);
}
synthesizer.allocate();
synthesizer.resume();
desc = (SynthesizerModeDesc) synthesizer.getEngineModeDesc();
Voice voices[] = desc.getVoices();
if(voices != null voices.length 0){
synthesizer.getSynthesizerProperties().setVoice(voices[0]);
synthesizer.speakPlainText("MPLS alarm: link down", null);
synthesizer.waitEngineState(0x10000L);
}
synthesizer.deallocate();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
服務器端:最簡單的就是暴露一個http接口
使用servlet,用tomact部署
會有一個地址,假設是:192.168.1.2:8080
客戶端:那就應該是向上述地址發(fā)送語音了
具體:監(jiān)聽音頻輸入源,使用傅里葉變換將語音轉(zhuǎn)換成數(shù)字信號
調(diào)用192.168.1.2:8080,將數(shù)字信號塞入request中,服務器端就能收到了
package com.cnblogs.htynkn;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
public interface QTSR extends Library {
QTSR INSTANCE = (QTSR) Native.loadLibrary("msc", QTSR.class);
/**
* 初始化MSC的ISR部分
*
* @param configs
* 初始化時傳入的字符串,以指定合成用到的一些配置參數(shù),各個參數(shù)以“參數(shù)名=參數(shù)值”的形式出現(xiàn),大小寫不敏感,不同的參數(shù)之間以“
* ,”或“\n”隔開,不設置任何值時可以傳入NULL或空串:
* @return 如果函數(shù)調(diào)用成功返回MSP_SUCCESS,否則返回錯誤代碼,錯誤代碼參見msp_errors
*/
public int QISRInit(String configs);
/**
* 開始一個ISR會話
*
* @param grammarList
* uri-list格式的語法,可以是一個語法文件的URL或者一個引擎內(nèi)置語法列表。可以同時指定多個語法,不同的語法之間以“,”
* 隔開。進行語音聽寫時不需要語法,此參數(shù)設定為NULL或空串即可;進行語音識別時則需要語法,語法可以在此參數(shù)中指定,
* 也可以隨后調(diào)用QISRGrammarActivate指定識別所用的語法。
* @param params
* 本路ISR會話使用的參數(shù),可設置的參數(shù)及其取值范圍請參考《可設置參數(shù)列表_MSP20.xls》,各個參數(shù)以“參數(shù)名=參數(shù)值”
* 的形式出現(xiàn),不同的參數(shù)之間以“,”或者“\n”隔開。
* @param errorCode
* 如果函數(shù)調(diào)用成功則其值為MSP_SUCCESS,否則返回錯誤代碼,錯誤代碼參見msp_errors。幾個主要的返回值:
* MSP_ERROR_NOT_INIT 未初始化 MSP_ERROR_INVALID_PARA 無效的參數(shù)
* MSP_ERROR_NO_LICENSE 開始一路會話失敗
* @return MSC為本路會話建立的ID,用來唯一的標識本路會話,供以后調(diào)用其他函數(shù)時使用。函數(shù)調(diào)用失敗則會返回NULL。
*/
public String QISRSessionBegin(String grammarList, String params,
IntByReference errorCode);
/**
* 傳入語法
*
* @param sessionID
* 由QISRSessionBegin返回過來的會話ID。
* @param grammar
* 語法字符串
* @param type
* 語法類型,可以是uri-list、abnf、xml等
* @param weight
* 本次傳入語法的權(quán)重,本參數(shù)在MSP 2.0中會被忽略。
* @return 如果函數(shù)調(diào)用成功返回MSP_SUCCESS,否則返回錯誤代碼,錯誤代碼參見msp_errors
*/
public int QISRGrammarActivate(String sessionID, String grammar,
String type, int weight);
/**
* 寫入用來識別的語音
*
* @param sessionID
* 由QISRSessionBegin返回過來的會話ID。
* @param waveData
* 音頻數(shù)據(jù)緩沖區(qū)起始地址
* @param waveLen
* 音頻數(shù)據(jù)長度,其大小不能超過設定的max_audio_size
* @param audioStatus
* 用來指明用戶本次識別的音頻是否發(fā)送完畢,可能值如下:
* MSP_AUDIO_SAMPLE_FIRST = 1 第一塊音頻
* MSP_AUDIO_SAMPLE_CONTINUE = 2 還有后繼音頻
* MSP_AUDIO_SAMPLE_LAST = 4 最后一塊音頻
* @param epStatus
* 端點檢測(End-point detected)器所處的狀態(tài),可能的值如下:
* MSP _EP_LOOKING_FOR_SPEECH = 0 還沒有檢測到音頻的前端點。
* MSP _EP_IN_SPEECH = 1 已經(jīng)檢測到了音頻前端點,正在進行正常的音頻處理。
* MSP _EP_AFTER_SPEECH = 3 檢測到音頻的后端點,后繼的音頻會被MSC忽略。
* MSP _EP_TIMEOUT = 4 超時。
* MSP _EP_ERROR= 5 出現(xiàn)錯誤。
* MSP _EP_MAX_SPEECH = 6 音頻過大。
* @param recogStatus
* 識別器所處的狀態(tài)
* @return
*/
public int QISRAudioWrite(String sessionID, Pointer waveData, int waveLen,
int audioStatus, IntByReference epStatus, IntByReference recogStatus);
/**
* 獲取識別結(jié)果
*
* @param sessionID 由QISRSessionBegin返回過來的會話ID。
* @param rsltStatus 識別結(jié)果的狀態(tài),其取值范圍和含義請參考QISRAudioWrite的參數(shù)recogStatus
* @param waitTime 與服務器交互的間隔時間,可以控制和服務器的交互頻度。單位為ms,建議取值為5000。
* @param errorCode 如果函數(shù)調(diào)用成功返回MSP_SUCCESS,否則返回錯誤代碼,錯誤代碼參見msp_errors
* @return 函數(shù)執(zhí)行成功并且獲取到識別結(jié)果時返回識別結(jié)果,函數(shù)執(zhí)行成功沒有獲取到識別結(jié)果時返回NULL
*/
public String QISRGetResult(String sessionID, IntByReference rsltStatus,
int waitTime, IntByReference errorCode);
/**
* 結(jié)束一路會話
*
* @param sessionID 由QISRSessionBegin返回過來的會話ID。
* @param hints 結(jié)束本次會話的原因描述,用于記錄日志,便于用戶查閱或者跟蹤某些問題。
* @return
*/
public int QISRSessionEnd(String sessionID, String hints);
/**
* 獲取與識別交互相關(guān)的參數(shù)
*
* @param sessionID 由QISRSessionBegin返回過來的會話ID。
* @param paramName 要獲取的參數(shù)名稱;支持同時查詢多個參數(shù),查詢多個參數(shù)時,參數(shù)名稱按“,” 或“\n”分隔開來。
* @param paramValue 獲取的參數(shù)值,以字符串形式返回;查詢多個參數(shù)時,參數(shù)值之間以“;”分開,不支持的參數(shù)將返回空的值。
* @param valueLen 參數(shù)值的長度。
* @return
*/
public int QISRGetParam(String sessionID, String paramName,
String paramValue, IntByReference valueLen);
/**
* 逆初始化MSC的ISR部分
*
* @return
*/
public int QISRFini();
}
*Msp_errors
?
package com.cnblogs.htynkn;
import com.sun.jna.win32.StdCallLibrary;
public interface Msp_errors extends StdCallLibrary {
public static final int MSP_SUCCESS = 0;
public static final int ERROR_FAIL = -1;
public static final int ERROR_EXCEPTION= -2;
public static final int ERROR_GENERAL= 10100; /* 0x2774 */
public static final int ERROR_OUT_OF_MEMORY= 10101; /* 0x2775 */
public static final int ERROR_FILE_NOT_FOUND= 10102; /* 0x2776 */
public static final int ERROR_NOT_SUPPORT= 10103; /* 0x2777 */
public static final int ERROR_NOT_IMPLEMENT= 10104; /* 0x2778 */
public static final int ERROR_ACCESS= 10105; /* 0x2779 */
public static final int ERROR_INVALID_PARA= 10106; /* 0x277A */
public static final int ERROR_INVALID_PARA_VALUE= 10107; /* 0x277B */
public static final int ERROR_INVALID_HANDLE= 10108; /* 0x277C */
public static final int ERROR_INVALID_DATA= 10109; /* 0x277D */
public static final int ERROR_NO_LICENSE= 10110; /* 0x277E */
public static final int ERROR_NOT_INIT= 10111; /* 0x277F */
public static final int ERROR_NULL_HANDLE= 10112; /* 0x2780 */
public static final int ERROR_OVERFLOW= 10113; /* 0x2781 */
public static final int ERROR_TIME_OUT= 10114; /* 0x2782 */
public static final int ERROR_OPEN_FILE= 10115; /* 0x2783 */
public static final int ERROR_NOT_FOUND= 10116; /* 0x2784 */
public static final int ERROR_NO_ENOUGH_BUFFER= 10117; /* 0x2785 */
public static final int ERROR_NO_DATA= 10118; /* 0x2786 */
public static final int ERROR_NO_MORE_DATA= 10119; /* 0x2787 */
public static final int ERROR_NO_RESPONSE_DATA= 10120; /* 0x2788 */
public static final int ERROR_ALREADY_EXIST= 10121; /* 0x2789 */
public static final int ERROR_LOAD_MODULE= 10122; /* 0x278A */
public static final int ERROR_BUSY = 10123; /* 0x278B */
public static final int ERROR_INVALID_CONFIG= 10124; /* 0x278C */
public static final int ERROR_VERSION_CHECK= 10125; /* 0x278D */
public static final int ERROR_CANCELED= 10126; /* 0x278E */
public static final int ERROR_INVALID_MEDIA_TYPE= 10127; /* 0x278F */
public static final int ERROR_CONFIG_INITIALIZE= 10128; /* 0x2790 */
public static final int ERROR_CREATE_HANDLE= 10129; /* 0x2791 */
public static final int ERROR_CODING_LIB_NOT_LOAD= 10130; /* 0x2792 */
/* Error codes of network 10200(0x27D8)*/
public static final int ERROR_NET_GENERAL= 10200; /* 0x27D8 */
public static final int ERROR_NET_OPENSOCK= 10201; /* 0x27D9 */ /* Open socket */
public static final int ERROR_NET_CONNECTSOCK= 10202; /* 0x27DA */ /* Connect socket */
public static final int ERROR_NET_ACCEPTSOCK = 10203; /* 0x27DB */ /* Accept socket */
public static final int ERROR_NET_SENDSOCK= 10204; /* 0x27DC */ /* Send socket data */
public static final int ERROR_NET_RECVSOCK= 10205; /* 0x27DD */ /* Recv socket data */
public static final int ERROR_NET_INVALIDSOCK= 10206; /* 0x27DE */ /* Invalid socket handle */
public static final int ERROR_NET_BADADDRESS = 10207; /* 0x27EF */ /* Bad network address */
public static final int ERROR_NET_BINDSEQUENCE= 10208; /* 0x27E0 */ /* Bind after listen/connect */
public static final int ERROR_NET_NOTOPENSOCK= 10209; /* 0x27E1 */ /* Socket is not opened */
public static final int ERROR_NET_NOTBIND= 10210; /* 0x27E2 */ /* Socket is not bind to an address */
public static final int ERROR_NET_NOTLISTEN = 10211; /* 0x27E3 */ /* Socket is not listening */
public static final int ERROR_NET_CONNECTCLOSE= 10212; /* 0x27E4 */ /* The other side of connection is closed */
public static final int ERROR_NET_NOTDGRAMSOCK= 10213; /* 0x27E5 */ /* The socket is not datagram type */
public static final int ERROR_NET_DNS= 10214; /* 0x27E6 */ /* domain name is invalid or dns server does not function well */
/* Error codes of mssp message 10300(0x283C) */
public static final int ERROR_MSG_GENERAL= 10300; /* 0x283C */
public static final int ERROR_MSG_PARSE_ERROR= 10301; /* 0x283D */
public static final int ERROR_MSG_BUILD_ERROR= 10302; /* 0x283E */
public static final int ERROR_MSG_PARAM_ERROR= 10303; /* 0x283F */
public static final int ERROR_MSG_CONTENT_EMPTY= 10304; /* 0x2840 */
public static final int ERROR_MSG_INVALID_CONTENT_TYPE = 10305; /* 0x2841 */
public static final int ERROR_MSG_INVALID_CONTENT_LENGTH = 10306; /* 0x2842 */
public static final int ERROR_MSG_INVALID_CONTENT_ENCODE = 10307; /* 0x2843 */
public static final int ERROR_MSG_INVALID_KEY= 10308; /* 0x2844 */
public static final int ERROR_MSG_KEY_EMPTY= 10309; /* 0x2845 */
public static final int ERROR_MSG_SESSION_ID_EMPTY= 10310; /* 0x2846 */
public static final int ERROR_MSG_LOGIN_ID_EMPTY= 10311; /* 0x2847 */
public static final int ERROR_MSG_SYNC_ID_EMPTY= 10312; /* 0x2848 */
public static final int ERROR_MSG_APP_ID_EMPTY= 10313; /* 0x2849 */
public static final int ERROR_MSG_EXTERN_ID_EMPTY= 10314; /* 0x284A */
public static final int ERROR_MSG_INVALID_CMD= 10315; /* 0x284B */
public static final int ERROR_MSG_INVALID_SUBJECT= 10316; /* 0x284C */
public static final int ERROR_MSG_INVALID_VERSION= 10317; /* 0x284D */
public static final int ERROR_MSG_NO_CMD= 10318; /* 0x284E */
public static final int ERROR_MSG_NO_SUBJECT= 10319; /* 0x284F */
public static final int ERROR_MSG_NO_VERSION= 10320; /* 0x2850 */
public static final int ERROR_MSG_MSSP_EMPTY= 10321; /* 0x2851 */
public static final int ERROR_MSG_NEW_RESPONSE= 10322; /* 0x2852 */
public static final int ERROR_MSG_NEW_CONTENT= 10323; /* 0x2853 */
public static final int ERROR_MSG_INVALID_SESSION_ID = 10324; /* 0x2854 */
/* Error codes of DataBase 10400(0x28A0)*/
public static final int ERROR_DB_GENERAL= 10400; /* 0x28A0 */
public static final int ERROR_DB_EXCEPTION= 10401; /* 0x28A1 */
public static final int ERROR_DB_NO_RESULT= 10402; /* 0x28A2 */
public static final int ERROR_DB_INVALID_USER= 10403; /* 0x28A3 */
public static final int ERROR_DB_INVALID_PWD= 10404; /* 0x28A4 */
public static final int ERROR_DB_CONNECT= 10405; /* 0x28A5 */
public static final int ERROR_DB_INVALID_SQL= 10406; /* 0x28A6 */
public static final int ERROR_DB_INVALID_APPID= 10407; /* 0x28A7 */
/* Error codes of Resource 10500(0x2904)*/
public static final int ERROR_RES_GENERAL= 10500; /* 0x2904 */
public static final int ERROR_RES_LOAD = 10501; /* 0x2905 */ /* Load resource */
public static final int ERROR_RES_FREE = 10502; /* 0x2906 */ /* Free resource */
public static final int ERROR_RES_MISSING = 10503; /* 0x2907 */ /* Resource File Missing */
public static final int ERROR_RES_INVALID_NAME = 10504; /* 0x2908 */ /* Invalid resource file name */
public static final int ERROR_RES_INVALID_ID = 10505; /* 0x2909 */ /* Invalid resource ID */
public static final int ERROR_RES_INVALID_IMG = 10506; /* 0x290A */ /* Invalid resource image pointer */
public static final int ERROR_RES_WRITE= 10507; /* 0x290B */ /* Write read-only resource */
public static final int ERROR_RES_LEAK = 10508; /* 0x290C */ /* Resource leak out */
public static final int ERROR_RES_HEAD = 10509; /* 0x290D */ /* Resource head currupt */
public static final int ERROR_RES_DATA = 10510; /* 0x290E */ /* Resource data currupt */
public static final int ERROR_RES_SKIP = 10511; /* 0x290F */ /* Resource file skipped */
/* Error codes of TTS 10600(0x2968)*/
public static final int ERROR_TTS_GENERAL= 10600; /* 0x2968 */
public static final int ERROR_TTS_TEXTEND = 10601; /* 0x2969 */ /* Meet text end */
public static final int ERROR_TTS_TEXT_EMPTY= 10602; /* 0x296A */ /* no synth text */
/* Error codes of Recognizer 10700(0x29CC) */
public static final int ERROR_REC_GENERAL= 10700; /* 0x29CC */
public static final int ERROR_REC_INACTIVE= 10701; /* 0x29CD */
public static final int ERROR_REC_GRAMMAR_ERROR= 10702; /* 0x29CE */
public static final int ERROR_REC_NO_ACTIVE_GRAMMARS = 10703; /* 0x29CF */
public static final int ERROR_REC_DUPLICATE_GRAMMAR= 10704; /* 0x29D0 */
public static final int ERROR_REC_INVALID_MEDIA_TYPE = 10705; /* 0x29D1 */
public static final int ERROR_REC_INVALID_LANGUAGE= 10706; /* 0x29D2 */
public static final int ERROR_REC_URI_NOT_FOUND= 10707; /* 0x29D3 */
public static final int ERROR_REC_URI_TIMEOUT= 10708; /* 0x29D4 */
public static final int ERROR_REC_URI_FETCH_ERROR= 10709; /* 0x29D5 */
/* Error codes of Speech Detector 10800(0x2A30) */
public static final int ERROR_EP_GENERAL= 10800; /* 0x2A30 */
public static final int ERROR_EP_NO_SESSION_NAME= 10801; /* 0x2A31 */
public static final int ERROR_EP_INACTIVE = 10802; /* 0x2A32 */
public static final int ERROR_EP_INITIALIZED = 10803; /* 0x2A33 */
/* Error codes of TUV */
public static final int ERROR_TUV_GENERAL= 10900; /* 0x2A94 */
public static final int ERROR_TUV_GETHIDPARAM = 10901; /* 0x2A95 */ /* Get Busin Param huanid*/
public static final int ERROR_TUV_TOKEN= 10902; /* 0x2A96 */ /* Get Token */
public static final int ERROR_TUV_CFGFILE= 10903; /* 0x2A97 */ /* Open cfg file */
public static final int ERROR_TUV_RECV_CONTENT = 10904; /* 0x2A98 */ /* received content is error */
public static final int ERROR_TUV_VERFAIL = 10905; /* 0x2A99 */ /* Verify failure */
/* Error codes of IMTV */
public static final int ERROR_LOGIN_SUCCESS= 11000; /* 0x2AF8 */ /* 成功 */
public static final int ERROR_LOGIN_NO_LICENSE = 11001; /* 0x2AF9 */ /* 試用次數(shù)結(jié)束,用戶需要付費 */
public static final int ERROR_LOGIN_SESSIONID_INVALID = 11002; /* 0x2AFA */ /* SessionId失效,需要重新登錄通行證 */
public static final int ERROR_LOGIN_SESSIONID_ERROR= 11003; /* 0x2AFB */ /* SessionId為空,或者非法 */
public static final int ERROR_LOGIN_UNLOGIN = 11004; /* 0x2AFC */ /* 未登錄通行證 */
public static final int ERROR_LOGIN_INVALID_USER = 11005; /* 0x2AFD */ /* 用戶ID無效 */
public static final int ERROR_LOGIN_INVALID_PWD = 11006; /* 0x2AFE */ /* 用戶密碼無效 */
public static final int ERROR_LOGIN_SYSTEM_ERROR= 11099; /* 0x2B5B */ /* 系統(tǒng)錯誤 */
/* Error codes of HCR */
public static final int ERROR_HCR_GENERAL= 11100;
public static final int ERROR_HCR_RESOURCE_NOT_EXIST = 11101;
public static final int ERROR_HCR_CREATE= 11102;
public static final int ERROR_HCR_DESTROY= 11103;
public static final int ERROR_HCR_START= 11104;
public static final int ERROR_HCR_APPEND_STROKES= 11105;
public static final int ERROR_HCR_GET_RESULT= 11106;
public static final int ERROR_HCR_SET_PREDICT_DATA= 11107;
public static final int ERROR_HCR_GET_PREDICT_RESULT = 11108;
/* Error codes of http 12000(0x2EE0) */
public static final int ERROR_HTTP_BASE= 12000; /* 0x2EE0 */
/*Error codes of ISV */
public static final int ERROR_ISV_NO_USER = 13000; /* 32C8 */ /* the user doesn't exist */
/* Error codes of Lua scripts */
public static final int ERROR_LUA_BASE= 14000; /* 0x36B0 */
public static final int ERROR_LUA_YIELD= 14001; /* 0x36B1 */
public static final int ERROR_LUA_ERRRUN= 14002; /* 0x36B2 */
public static final int ERROR_LUA_ERRSYNTAX= 14003; /* 0x36B3 */
public static final int ERROR_LUA_ERRMEM= 14004; /* 0x36B4 */
public static final int ERROR_LUA_ERRERR= 14005; /* 0x36B5 */
網(wǎng)頁題目:java語音播報源代碼 java語音播報源代碼大全
網(wǎng)頁地址:http://jinyejixie.com/article44/dosjoee.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設、響應式網(wǎng)站、定制網(wǎng)站、虛擬主機、App設計、品牌網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)