導航:首頁 > 編程語言 > java加聲音

java加聲音

發布時間:2022-12-14 13:18:46

❶ 在java程序中加入語音功能,例如給段字元串「A101」,就能發出聲音,請大家幫幫忙,謝謝

為應用程序加上語音能力有什麼好處呢?粗略地講,是為了趣味,它適合所有注重趣味的應用,比如游戲。當然,從更嚴肅的角度來講,它還涉及到應用的可用性問題。注意,這里我考慮的不僅是可視化界面固有的不足,而且還有這樣一些情形:一些時候,讓雙眼離開當前的工作很不方便,甚至是不合法的。比如,假設有一個帶語音功能的瀏覽器,你就可以在外出散步或開車上班的同時,用聽的方式瀏覽自己喜愛的網站。從目前來看,郵件閱讀器或許是語音技術更實際的應用,在JavaMail API的幫助下,這一切已經可能。郵件閱讀器可以定期地檢查收件箱,然後用語音「You have new mail, would you like me to read it to you?」引起你的注意。按照類似的思路,我們還可以考慮一個帶語音功能的提醒器,把它連接到一個日歷應用:它會及時地提醒你「Don't forget your meeting with the boss in 10 minutes!」。 也許你已經被這些主意吸引,或者有了自己更好的主意,現在讓我們繼續。首先我將介紹如何啟用本文提供的語音引擎,這樣,如果你認為語音引擎的實現細節過於復雜,就可以直接使用它而忽略其實現細節。
一、試用語音引擎 要使用這個語音引擎,你必須在CLASSPATH中加入本文提供的javatalk.jar文件,然後從命令行運行(或者從Java程序調用)com.lotontech.speech.Talker類。如果從命令行運行,則命令為: java com.lotontech.speech.Talker "h|e|l|oo" 如果從Java程序調用,則代碼為: com.lotontech.speech.Talker talker=new com.lotontech.speech.Talker(); talker.sayPhoneWord("h|e|l|oo"); 現在,對於在命令行上(或者調用sayPhoneWord()方法時)提供的「h|e|l|oo」字元串,你或許有所不解。下面我就來解釋一下。 語音引擎的工作原理是把細小的聲音樣本連接起來,每一個樣本都是人的語言發音(英語)的一個最小單位。這些聲音樣本稱為音素(allophone)。每一個因素對應一個、二個或者三個字母。從前面「hello」的語音表示可以看出,一些字母組合的發音顯而易見,還有一些卻不是很明顯: h -- 讀音顯而易見 e -- 讀音顯而易見 l -- 讀音顯而易見,但注意兩個「l」被簡縮成了一個「l」。 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 人說話的時候,語音在整個句子之內起落變化。語調變化使得語音更自然、更富有感染力,使得問句和陳述句能夠相互區別。請考慮下面兩個句子: It is fake -- f|aa|k Is it fake? -- f|AA|k 也許你已經猜想到,提高語調的方法是使用大寫字母。 以上就是使用該軟體時你需要了解的東西。如果你對其後台實現細節感興趣,請繼續閱讀。
二、實現語音引擎 語音引擎的實現只包括一個類,四個方法。它利用了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; } 如果從命令行執行Talker,下面的main()方法將作為入口點運行。main()方法獲取第一個命令行參數,然後把它傳遞給sayPhoneWord()方法: /* * 讀出在命令行中指定的表示讀音的字元串 */ public static void main(String args[]) { Talker player=new Talker(); if (args.length>0) player.sayPhoneWord(args[0]); System.exit(0); }
sayPhoneWord()方法既可以通過上面的main()方法調用,也可以在Java程序中直接調用。從表面上看,sayPhoneWord()方法比較復雜,其實並非如此。實際上,它簡單地遍歷所有單詞的語音元素(在輸入字元串中語音元素以「|」分隔),通過一個聲音輸出通道一個元素一個元素地播放出來。為了讓聲音更自然一些,我把每一個聲音樣本的結尾和下一個聲音樣本的開頭合並了起來: /* * 讀出指定的語音字元串 */ public void sayPhoneWord(String word) { // 為上一個聲音構造的模擬byte數組 byte[] previousSound=null; // 把輸入字元串分割成單獨的音素 StringTokenizer st=new StringTokenizer(word,"|",false); while (st.hasMoreTokens()) { // 為音素構造相應的文件名字 String thisPhoneFile=st.nextToken(); thisPhoneFile="/allophones/"+thisPhoneFile+".au"; // 從聲音文件讀取數據 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); // 把經過截短的當前音素作為前一個音素 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()的後面,你可以看到它調用playSound()輸出單個聲音樣本(即一個音素),然後調用drain()清理聲音通道。下面是playSound()的代碼: /* * 該方法播放一個聲音樣本 */ private void playSound(byte[] data) { if (data.length>0) line.write(data, 0, data.length); } 下面是drain()的代碼: /* * 該方法清理聲音通道 */ private void drain() { if (line!=null) line.drain(); try {Thread.sleep(100);} catch (Exception e) {} }
現在回過頭來看sayPhoneWord(),這里還有一個方法我們沒有分析,即getSound()方法。 getSound()方法從一個au文件以位元組數據的形式讀入預先錄制的聲音樣本。要了解讀取數據、轉換音頻格式、初始化聲音輸出行(SouceDataLine)以及構造位元組數據的詳細過程,請參考下面代碼中的注釋: /* * 該方法從文件讀取一個音素, * 並把它轉換成byte數組 */ private byte[] getSound(String fileName) { try { URL url=Talker.class.getResource(fileName); AudioInputStream stream = AudioSystem.getAudioInputStream(url); AudioFormat format = stream.getFormat(); // 把一個ALAW/ULAW聲音轉換成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]; // 讀取位元組數據,並計數 int numBytesRead = 0; if ((numBytesRead = stream.read(data)) != -1) { int numBytesRemaining = numBytesRead; } // 把位元組數據切割成合適的大小 byte[] newData=new byte[numBytesRead]; for (int i=0; i newData[i]=data[i]; return newData; } catch (Exception e) { return new byte[0]; } } 這就是全部的代碼,包括注釋在內,一個大約150行代碼的語音合成器。
三、文本-語音轉換 以語音元素的格式指定待朗讀的單詞似乎過於復雜,如果要構造一個能夠朗讀文本(比如Web頁面或Email)的應用,我們希望能夠直接指定原始的文本。 深入分析這個問題之後,我在本文後面的ZIP文件中提供了一個試驗性的文本-語音轉換類。運行這個類,它將顯示出分析結果。文本-語音轉換類可以從命令行執行,如下所示: java com.lotontech.speech.Converter "hello there" 輸出結果類如: hello -> h|e|l|oo there -> dth|aer 如果運行下面這個命令: java com.lotontech.speech.Converter "I like to read JavaWorld" 則輸出結果為: i -> ii like -> l|ii|k to -> t|ouu read -> r|ee|a|d java -> j|a|v|a world -> w|err|l|d 這個轉換類是如何工作的呢?實際上,我的方法相當簡單,轉換過程就是以一定的次序應用一組文本替換規則。例如對於單詞「ant」、「want」、「wanted」、「unwanted」和「unique」,則我們想要應用的替換規則可能依次為: 用「|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 (規則2) [|u|][|n|][|w|o|n|t|][|e|][|d|] (規則4、5、6、7) u|n|w|o|n|t|e|d (刪除多餘的符之後) 你將看到包含字母「wont」的單詞和包含字母「ant」的單詞以不同的方式發音,還將看到在特例規則的作用下,「unique」作為一個完整單詞優先於其他規則,從而「unique」這個單詞讀作「y|ou...」而不是「u|n...」。

❷ 如何讓Java發出聲音

public class MySound{
public MySound(){
//C:\Program Files\Java\jdk1.6.0\jre\lib\rt.jar這個jar包怎麼加進工程,我放在那個工程中也沒用
try {
InputStream in = new FileInputStream("hello.wav");//找到這個音樂文件
AudioStream as = new AudioStream(in);
AudioPlayer.player.start(as);// 開始播放
//AudioPlayer.player.stop(as);
}catch(FileNotFoundException e){
}
catch(IOException e){
}
}
public static void main(String[] args) {
new MySound3();
}
}

❸ 怎麼在自己寫的java應用程序中加入聲音

導入applet包
import java.applet.*;

static AudioClip shot=Applet.newAudioClip(Tank.class.getClassLoader().getResource("sounds/shot.wav"));
在需要的地方調用shot.play();shot.loop();shot.stop();
註:sounds文件夾是裝音樂的文件夾,位於bin根目錄下,只能是wav或mid格式的音樂。

❹ 懸賞20!!!JAVA—怎麼弄一點聲音

這你有兩個文件 需要注意 音樂的路徑 同時Java不支持MP3 格式的音樂
但支持wav,mid,au,aif.rfm.格式
第一個 sound.java
代碼如下
import java.applet.*;
public class sound extends Applet{
AudioClip ac;
public void init(){
ac=getAudioClip(getCodeBase(),"音樂名稱.wav");
}
public void start(){
ac.loop();
}
public void stop(){
ac.stop();
}
}
第二個文件 sound.html
<html>
<body>
<applet code="sound.class" height=500 width=500 >
</applet>
</body>
</html>

❺ java中Swing怎麼添加音樂

JAVA應用程序添加背景音樂示例:

1.先定義一個 URL 對象,並賦NULL值;

URL musicURL = null;

2.然後為定義的 URL 賦值,即得到要播放的URL地址,

musicURL = new URL( "音樂地址");//得到要播放音樂的url

3.創建一個播放音頻的實例,並得到這個實例

AudioClip ac = Applet.newAudioClip(musicURL); //得到一個播放音頻的實例

4.進行播放控制

ac.play(); //播放一編

ac.loop(); //循環播放

ac.stop();//停止

播放本地音樂示例:

private void playMusic(){
try {
javax.media.Player player;
if(null==player){
File musicFile=new File("./music.mp3");//得到一個MP3文件
if(musicFile.exists()){
MediaLocator locator=new MediaLocator("file:"+musicFile.getAbsolutePath());
player = Manager.createRealizedPlayer(locator);
player.prefetch();//預讀文件
}else{
System.err.println(pro.getMusicFile()+" 找不到");
}
}
//centerpanel.add(player.getControlPanelComponent()!=null?player.getControlPanelComponent():null);//顯示播放工具
player.start();//播放
} catch (CannotRealizeException ex) {
ex.printStackTrace();
} catch (NoPlayerException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}

❻ 怎樣在JAVA中插入聲音

import java.applet.*;
import java.net.URL;
import java.io.*;
class Voice
{
AudioClip beijing;
File file999;
URL url999,;
File file100,;

public Voice()
{
file999=new File("Sound\\背景Doom.wav");
try
{
url999=file999.toURL();

}
catch (Exception e)
{
}
beijing=Applet.newAudioClip(url999);

kaishi=Applet.newAudioClip(url000);
}
public void play(int m)
{
switch(m)
{
case 1: beijing.play();
break;
}
}
public void stop(int m)
{
switch(m)
{
case 1: beijing.stop();
break;}
}
}

用的時候調用函數就可以了
譬如,設置游戲背景音樂的時候,在主界面定義一個成員變數 voice v
然後 ,v.play(1);
就行了
我是這末實現的,一點淺薄的見解,不要見笑

❼ 如何在java應用程序中加入循環播放的聲音,請各位大俠一定要測試通過之後再發言呀,若被採納必有重謝。

利用線程,實現run()方法,
public void run(){
while(true){
這里還要控制好時間 Thread.sleep(播放的時間長短);
調用播放聲音的方法就行。
}
}

❽ java中如何給按鈕添加聲音,只要一按就有聲音

//給你個例子
import java.io.*;
import javax.sound.sampled.*;
import javax.swing.*;
import java.awt.event.*;

public class Au extends JFrame
{
public static void main(String[] args)
{
Au w=new Au();
}
Au()
{
JButton b=new JButton("播放");
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
play();
}
});
add(b);
setResizable(false);
pack();
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
void play()
{
//將f指定為聲音文件的文件名,
//聲音文件只能是WAVE、AU、AIFF、AIFC、SND格式的。
final String f="s.wav";
Clip c=null;

try
{
c=AudioSystem.getClip();
c.open(AudioSystem.getAudioInputStream(new File(f)));
c.loop(0);
}
catch(Exception ex)
{

}
}
}

❾ 怎麼在java中給按鍵添加聲音

import javax.sound.midi.*;
import javax.sound.sampled.*;
import java.io.File;

public class SoundTest{
public static void main(String args[])throws Exception{
//下面是播放wav聲音的代碼
/* File wavFile = new File("D:\\yy.wav");//可以使用文件
//InputStream in = new FileInputStream(wavFile);//也可以使用流
//URL url = wavFile.toURI().toURL();//還可以使用URL
AudioInputStream ais = AudioSystem.getAudioInputStream(wavFile);//這里使用上面的三種,那種都可以
Clip clip = AudioSystem.getClip();
clip.open(ais);
clip.start();
*/
//下面是播放midi音樂的代碼
File midiFile = new File("D:/midi180.mid");
Sequence sequence = MidiSystem.getSequence(midiFile);//這里同上面的,也可使用流和URL
Sequencer sequencer = MidiSystem.getSequencer();
sequencer.setSequence(sequence);
sequencer.open();
sequencer.start();
//sequencer.wait(300, 500);
// sequencer.close();
}
}
以上就是調用音頻文件的代碼。
至於加監聽,那都是小事了。
保證好用,只不過midi的文件,自己要找。
還有謝謝小涼。。。。

❿ 有一個java小程序,是貪吃蛇游戲,如何往裡面添加聲音代碼呢,讓聲音在「Gameover」的時候播放

這個設置好的沒辦法做;如果真的要做的話那麼就相當於重做一個游戲了,你想想看真的有這樣的善人嗎?所以還是現實點吧朋友你就湊合著玩就好了如何?

閱讀全文

與java加聲音相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:758
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:672
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:486
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:383
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:350
風翼app為什麼進不去了 瀏覽:779
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:151
伊克塞爾文檔怎麼進行加密 瀏覽:893
app轉賬是什麼 瀏覽:163