線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5163
推到 Plurk!
推到 Facebook!

如何在delphi下用sapi動態產生wav文件

缺席
芳草萋萋
一般會員


發表:7
回覆:4
積分:2
註冊:2003-07-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-01 13:46:04 IP:218.22.xxx.xxx 未訂閱
諸位,我想在delphi下用 Microsoft Speech SDK SAPI 5.1 動態的將文本由tts轉換成wav文件而不發聲讀出(建立一個procedure,輸入參數為字符串,完成語音轉換並以wav格式存儲,但不立即讀出),Microsoft Speech SDK SAPI 5.1 的幫助文檔里只有相似vb(不太熟悉啊)例程,且是需要鼠標事件觸發,十分不便(見附),若有仙人精通兩種語言,解答此疑難,小妹不勝感激!
附(vb例程):
Option Explicit Const FILENAME1 = "c:\hello.wav" Dim V As SpeechLib.SpVoice
Dim S1 As SpeechLib.SpFileStream Private Sub Command1_Click() Dim a As String 'text to be spoken a = "您好!"
'Create WAV file of "您好" 'Speak the words into a single filestream object, 'and remember the end-of-stream position of each word. S1.Open FILENAME1, SSFMCreateForWrite Set V.AudioOutputStream = S1 V.Speak a S1.Close End Sub Private Sub Form_Load() Set V = New SpeechLib.SpVoice Set S1 = New SpFileStream 'Create stream1 End Sub
編輯記錄
taishyang 重新編輯於 2012-07-08 19:50:06, 註解 無‧
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-01 16:20:32 IP:61.155.xxx.xxx 未訂閱
VB->DELPHI    unit Unit1;    interface    uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, //可能需要导入这个控件   SpeechLib ; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private procedure test; { Private declarations } public { Public declarations } end; var Form1: TForm1; //假设有这两个类型 v:SpVoice; S1:SpFileStream; Const FILENAME1 ='c:\hello.wav' implementation {$R *.dfm} //按您的程序原样转换 procedure TForm1.test; var a:string; begin a='你好¡'; S1.Open(FILENAME1, SSFMCreateForWrite); V.AudioOutputStream = S1; V.Speak(a); S1.Close; end; procedure TForm1.FormCreate(Sender: TObject); begin V =SpVoice.create; S1 =SpFileStream.create; end; end. //供参考! 风花雪月 e梦情缘
------
风花雪月 e梦情缘
芳草萋萋
一般會員


發表:7
回覆:4
積分:2
註冊:2003-07-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-01 16:52:15 IP:218.22.xxx.xxx 未訂閱
雖然很感激你的回答,可是這不是代碼的簡單轉換,問題還沒解決,那位大蝦在 >
Rain
資深會員


發表:31
回覆:236
積分:268
註冊:2003-02-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-01 18:37:04 IP:218.85.xxx.xxx 未訂閱
芳草萋萋你好: 我想這邊精通C和Delphi的高人大概會多一些,我幫你貼了段C的代碼, 再等其他人幫你轉成Delphi一下好了(C和Delphi導入的Speech objects 類型庫單元結構也會相近一些,沒有VB那麼簡單有個SpFileStream)。大體上要定義和調用的過程如下: uses SpeechLib_TLB; var   V: TSpVoice;   S1: TSpStream; SA: ISpAudio;    var   a: string;   AGUID: TGUID;   AWAVEFORMATEX: WAVEFORMATEX;   FileName: word; begin   a := '您好!' ;   SA.SetFormat(AGUID, AWAVEFORMATEX);   S1.BindToFile(FileName, SPFM_CREATE_ALWAYS, AGUID, AWAVEFORMATEX, 0);   //V.Speak();   V.SetOutput(S1, 1);   S1.Close; end;    OnCreate V := TSpVoice.Create(nil); S1 := TSpStream.Create(nil); OnDestroy V := nil; S1 := nil;    下面是C的代碼:    HRESULT hr = S_OK; CComPtr  cpVoice; CComPtr cpStream; CSpStreamFormat cAudioFmt; //Create a SAPI Voice hr = cpVoice.CoCreateInstance( CLSID_SpVoice ); //Set the audio format if(SUCCEEDED(hr)) { hr = cAudioFmt.AssignFormat(SPSF_22kHz16BitMono); } //Call SPBindToFile, a SAPI helper method, to bind the audio stream to the file if(SUCCEEDED(hr)) { hr = SPBindToFile( L攃:\\ttstemp.wav? SPFM_CREATE_ALWAYS, &cpStream, & cAudioFmt.FormatId(),cAudioFmt.WaveFormatExPtr() ); } //set the output to cpStream so that the output audio data will be stored in cpStream if(SUCCEEDED(hr)) { hr = cpVoice->SetOutput( cpStream, TRUE ); } //Speak the text 揾ello world?synchronously if(SUCCEEDED(hr)) { hr = cpVoice->Speak( L"Hello World", SPF_DEFAULT, NULL ); } //close the stream if(SUCCEEDED(hr)) { hr = cpStream->Close(); } //Release the stream and voice object cpStream.Release (); cpVoice.Release(); ected
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-02 08:22:50 IP:61.155.xxx.xxx 未訂閱
目前支持中文的Speech SDK最高版本为Windows平台下的SAPI 5.1>>> 如何把文本通过喇叭朗读出来以及把文本转化成语音信号(Wave声音文件) c#例子: http://www.mktgservice.com/developerclub/microchinacom/comtext21.htm    风花雪月 e梦情缘
------
风花雪月 e梦情缘
芳草萋萋
一般會員


發表:7
回覆:4
積分:2
註冊:2003-07-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-02 12:02:57 IP:218.22.xxx.xxx 未訂閱
多謝wnhoo和rain的響應,我也看過Microsoft Speech SDK SAPI 5.1的help例程用一款國產軟件的delphi例程解決了此問題,主要是想讓沒有chinese tts的msagent動態發聲(只認wav文件^-^),可惡的是這是一款註冊軟件,沒有源碼開放,只提供了dll。  已在library里導入了SpeechLib_TLB,希望實現如下: procedure speech(str:string); begin SpeakToWave(str,progpath+voicepath+'temp.wav',20,1,80,100,35,0,''); //參數:要讀的文本,存貯文件名,朗读文本的方式,语音库語言選擇,語速,音量,wav格式,標點斷讀 end; 哪位大蝦願意試一下?
cbcfrank
一般會員


發表:0
回覆:1
積分:0
註冊:2012-07-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2012-07-01 19:30:54 IP:124.42.xxx.xxx 訂閱
準備控件:SpVoice,SpFileStream,SaveDialog,Button 
代碼:
Procedure TForm1.Button.click(sender:TObject);
begin
savedialog.filter:= 'wave文件|*.wav ';
if savedialog.execute then
begin
spfilestream.format.type_:=SAFT32KHz8BitMono;
spfilestream.open(savedialog1.filename,SSFMCreateForWrite,False);
SpVoice.allowAudioOutputFormatChangesOnNextSet:=false;
Spvoice.AudioOutputStream:=SpFilestream.defaultInterface;
SpVoice.Speak( '祝朋友們工作順利! ',1);
SpVoice.waitUntilDone(-1);
Spfilestream.close;
end;
end;
摘自:http://topic.csdn.net/t/20031110/14/2445499.html
系統時間:2018-01-21 13:04:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!