如何在delphi下用sapi動態產生wav文件 |
缺席
|
芳草萋萋
一般會員 發表:7 回覆:4 積分:2 註冊:2003-07-01 發送簡訊給我 |
諸位,我想在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 發送簡訊給我 |
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 發送簡訊給我 |
|
Rain
資深會員 發表:31 回覆:236 積分:268 註冊:2003-02-17 發送簡訊給我 |
芳草萋萋你好:
我想這邊精通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
|
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
|
芳草萋萋
一般會員 發表:7 回覆:4 積分:2 註冊:2003-07-01 發送簡訊給我 |
多謝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 發送簡訊給我 |
準備控件: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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |