開發環境 win7 Delphi7
主要目的:呼叫win7自帶的SAPI 5.4(TTS)生成語音流,并通過DSPack組件分別在電腦左右的聲道發音。由于反復使用頻率較高,所以未生成語音檔案而生成語音流,通過記憶體中讀取的方式。
為解決于是在網上搜索到一些文章,并在
http://www.delphi2007.net/delphiblog/html/delphi_200711515440514966.html提示下修改了DSpack, 增加了
function TFilterGraph.RendStream(Stream: TStream): HRESULT; 的方法。
現在問題來了,在呼叫TTS 的TSpMemoryStream類生成OleVariant型別 如何轉換為 TStream型別讓DSpack組件讀出來????
除此外是否還有更好辦法,1.只要滿足TTS生成語音,2. 發聲時可選左右聲道也就是擁有類似Balance的屬性,3.生成語音檔案不存于硬碟。
謝謝各位大神,大牛,大哥!有沒看懂問題的,小弟隨時回復!!!
SpMemoryStream1.Format.type_:=SAFT8kHz8BitMono;這段是呼叫TTS的TSpMemoryStream生成的(Music:OleVariant;)不知對了沒有?
SpMemoryStream1.SetData(Music);
sp.AudioOutputStream:=SpMemoryStream1.DefaultInterface;
sp.Speak(Memo1.Text,SVSFlagsAsync);
sp.WaitUntilDone(-1);
Music:=SpMemoryStream1.GetData;
uj5u.com熱心網友回復:
看看哪種適合你(未測驗)代碼一:
Do you mean a variant array of bytes?
function VarBytesFromStream(s: TStream; Size: integer): OleVariant;
var
p: pchar;
begin
Result := varArrayCreate([0, Size-1], VarByte);
p := varArrayLock(Result);
try
S.Read(p^, Size);
finally
varArrayUnlock(Result);
end
end;
procedure VarBytesToStream(const Value:OleVariant; s: TStream);
var
p: pchar;
size: integer;
begin
size := VarArrayHighBound(value,1) - VarArrayLowBound(value,1) + 1;
p := VarArrayLock(Value);
try
S.Write(p^, Size);
finally
VarArrayUnlock(Value)
end;
end;
代碼二:
function MemoryStreamToOleVariant(Strm: TMemoryStream):
OleVariant;
var
Data: PByteArray;
begin
Result := VarArrayCreate ([0, Strm.Size - 1], varByte);
Data := VarArrayLock(Result);
try
Strm.Position := 0;
Strm.ReadBuffer(Data^, Strm.Size);
finally
VarArrayUnlock(Result);
end;
end;
function OleVariantToMemoryStream(OV: OleVariant):
TMemoryStream;
var
Data: PByteArray;
Size: integer;
begin
Result := TMemoryStream.Create;
try
Size := VarArrayHighBound (OV, 1) - VarArrayLowBound
(OV, 1) + 1;
Data := VarArrayLock(OV);
try
Result.Position := 0;
Result.WriteBuffer(Data^, Size);
finally
VarArrayUnlock(OV);
end;
except
Result.Free;
Result := nil;
end;
end;
uj5u.com熱心網友回復:
代碼二之前已經試過, 轉換后貌似格式不對未能發聲。剛剛試了你給的代碼一中的procedure VarBytesToStream(const Value:OleVariant; s: TStream)方法; 除錯中在S.Write(p^, Size); 時報錯,錯誤如圖,是哪里不對呢?望請再指教,謝謝!
uj5u.com熱心網友回復:
經過測驗,把TTS的TSpMemoryStream生成在記憶體的語音流,以char型別轉換,資料結果與實際檔案輸出的wav檔案資料(注:所播報的語音內容都為:1234)對比相差甚遠。以Byte型別轉換,結果也是不一致。請問,TTS的TSpMemoryStream是否是語音流的輸出???????或者是我TSpMemoryStream使用不對,請各位大神指教!
uj5u.com熱心網友回復:
自己頂一下!求高手幫忙!TTS是否支持輸出記憶體流????
uj5u.com熱心網友回復:
大家好,我想下載SAPI5.4版本,用于XP系統,但就是找不到下載的地址?誰有?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/76030.html
