用SAPI的delphi包控件将读出的文字保存成wav文件?给出一段VC代码,谁能转成delphi??

lhz888 2003-11-10 02:22:00
用SAPI的delphi包控件有spvoice,SpFileStream,spAdouiout等控,现我想TTS读出的文字保存成wav文件(路胫指定),以下给出VC代码,求对应的delphi代码,十wan火急!!!!
------------------------------------------------
vc代码
=================================================
case IDC_SAVETOWAV:
{
USES_CONVERSION;

TCHAR szFileName[256];
_tcscpy(szFileName, _T("\0"));

BOOL bFileOpened = CallSaveFileDialog( szFileName,
_T("WAV (*.wav)\0*.wav\0All Files (*.*)\0*.*\0") );

if (bFileOpened == FALSE) break;

wcscpy( m_szWFileName, T2W(szFileName) );

CSpStreamFormat OriginalFmt;
hr = m_cpVoice->GetOutputStream( &cpOldStream );
if (hr == S_OK)
{
hr = OriginalFmt.AssignFormat(cpOldStream);
}
else
{
hr = E_FAIL;
}
// User SAPI helper function in sphelper.h to create a wav file
if (SUCCEEDED(hr))
{
hr = SPBindToFile( m_szWFileName, SPFM_CREATE_ALWAYS, &cpWavStream, &OriginalFmt.FormatId(), OriginalFmt.WaveFormatExPtr() );
}
if( SUCCEEDED( hr ) )
{
// Set the voice's output to the wav file instead of the speakers
hr = m_cpVoice->SetOutput(cpWavStream, TRUE);
}

if ( SUCCEEDED( hr ) )
{
// Do the Speak
HandleSpeak();
}

// Set output back to original stream
// Wait until the speak is finished if saving to a wav file so that
// the smart pointer cpWavStream doesn't get released before its
// finished writing to the wav.
m_cpVoice->WaitUntilDone( INFINITE );
cpWavStream.Release();

// Reset output
m_cpVoice->SetOutput( cpOldStream, FALSE );

-----------------------------------------------------------------------
...全文
376 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhz888 2003-11-13
  • 打赏
  • 举报
回复
风兄,太谢谢你了,可以了!!!多谢啦~!!!
偶的QQ是13193300,不过不是常在线,现在结贴给分!!
^_^

lhz888 2003-11-12
  • 打赏
  • 举报
回复
各位在delphi下用过SAPI的兄弟也来指点一下,很急的!!~~
lhz888 2003-11-12
  • 打赏
  • 举报
回复
aiirii:

我就是想把文字读出时保存成wav文件,可是我搞了好久都搞不定,急死人!!将代吗贴出来给你指点一下:
-------------------------------------------------------------------
uses SpeechLib_TLB, OleServer,MMsystem;//包含单元
-------------------------------------------------------------------
public//定义公共变量
pMode:SPFILEMODE;

voiceObj:ISpvoice;
steamFmtobj:ISpStreamFormat;
streamobj:ISpStream;
guid:TGUID;

end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);//一按钮事件(将读出的文字保存到指定的wav文件)
var
pGuid:pointer;
iSpeechFlags :integer;//flag
pwFileName :PWideChar;//保存目录
wTemp :word;//目录地址
WFormatEx :WaveFormatEx;//格式
text: PWideChar;
iOutCount: cardinal;
begin
iSpeechFlags:= SVSFlagsAsync or SVSFPurgeBeforeSpeak or SVSFIsXML;
//wTemp:=PWideString('c:\1.wav');
pwFileName:='c:\1.wav';
wTemp:=integer(@pwFileName);
WFormatEx.wFormatTag:=WAVE_FORMAT_PCM;
WFormatEx.nChannels:=1;//mono
WFormatEx.nSamplesPerSec:=11025; //11kHz sampling
WFormatEx.nAvgBytesPerSec:=11025; //we aim to use 8 bit sound so only 11k per second
WFormatEx.nBlockAlign:=4; //only 4 byte in each sample
WFormatEx.wBitsPerSample:=16; //采样16bit
WFormatEx.cbSize:=0;

//WFormatEx:=WAVE_FORMAT_1M16;
//创建com
voiceObj:=createcomobject(CLASS_SpVoice) as ISpvoice;
voiceObj.GetOutputStream(steamFmtobj);
streamobj:=createcomobject(CLASS_SpStream) as ISpStream;
olecheck(steamFmtobj.GetFormat(guid,pGuid));//这里出错了,说什么指针无效
{-------------------------------------------------------
hr = cpSpStream->BindToFile(WAVE_FILENAME,
SPFM_CREATE_ALWAYS,
&Fmt.FormatId(),
Fmt.WaveFormatExPtr(),
NULL);
-------------------------------------------------------}
{pchar('c:\1.wav')}
{ function BindToFile(var pszFileName: Word; eMode: SPFILEMODE; var pFormatId: TGUID;
var pWaveFormatEx: WaveFormatEx; ullEventInterest: Largeuint): HResult; stdcall;
}
olecheck(streamobj.BindToFile( wTemp,
SPFM_CREATE_ALWAYS,
guid,
WFormatEx,
0 ));


olecheck(voiceObj.SetOutput(streamobj,1));

text:='hello,hello,hello,hello';

olecheck(voiceObj.Speak(text,0,iOutCount));

olecheck(voiceObj.WaitUntilDone(1000));
streamobj.Close;
showmessage('x');
end;

-------------------------------------------------------------------------
以上代码是根据上面的VC代码过来的,我对VC不太了解,请aiirii兄帮帮我
eWong2016 2003-11-12
  • 打赏
  • 举报
回复
★★将文本保存为音频文件(wav)的方法
准备控件: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('祝CSDN的朋友工作顺利!',1);
SpVoice.waitUntilDone(-1);
Spfilestream.close;
end;
end;
//若有不妥之处,请告知在下isxuzhu@sohu.com QQ:122512447
flfljh 2003-11-11
  • 打赏
  • 举报
回复
up
lhz888 2003-11-11
  • 打赏
  • 举报
回复
有谁知道下面这个函数怎么用吗?
SAPI 函数

function BindToFile(var pszFileName: Word; eMode: SPFILEMODE; var pFormatId: TGUID;var pWaveFormatEx: WaveFormatEx; ullEventInterest: Largeuint): HResult; stdcall;
aiirii 2003-11-11
  • 打赏
  • 举报
回复
有啊, 以前的事了!
lhz888 2003-11-11
  • 打赏
  • 举报
回复
aiirii(ari)兄有没有在delphi用过SAPI?
aiirii 2003-11-10
  • 打赏
  • 举报
回复
大概如此:

var
szFileName: array[0..255] of char;
bFileOpened: boolean;
OriginalFmt: CSpStreamFormat;
begin
case XX of
IDC_SAVETOWAV:
begin
// USES_CONVERSION;

szFileName[0] := #0;

bFileOpened := OpenDiaLog1.Execute;
// CallSaveFileDialog( szFileName,
// _T("WAV (*.wav)\0*.wav\0All Files (*.*)\0*.*\0") );

if (not bFileOpened) then
exit;
szFileName := OpenDialog1.FileName;

// wcscpy(m_szWFileName, T2W(szFileName));
GetMem(m_szWFileName, SizeOf(szFileName) * 2);
WideCharToMultiByte(CP_ACP, MB_COMPOSITE, Pchar(szFileName), SizeOf(szFileName),
PWideChar(m_szWFileName), SizeOf(m_szWFileName));
hr := m_cpVoice^.GetOutputStream(@cpOldStream);
if (hr = S_OK) then
begin
hr := OriginalFmt.AssignFormat(cpOldStream);
end
else
begin
hr := E_FAIL;
end;
// User SAPI helper function in sphelper.h to create a wav file
if (SUCCEEDED(hr)) then
begin
hr := SPBindToFile(m_szWFileName, SPFM_CREATE_ALWAYS, @cpWavStream,
@OriginalFmt.FormatId(), OriginalFmt.WaveFormatExPtr());
end;
if (SUCCEEDED(hr)) then
begin
// Set the voice's output to the wav file instead of the speakers
hr := m_cpVoice^.SetOutput(cpWavStream, TRUE);
end;

if (SUCCEEDED(hr)) then
begin
// Do the Speak
HandleSpeak();
end;

// Set output back to original stream
// Wait until the speak is finished if saving to a wav file so that
// the smart pointer cpWavStream doesn't get released before its
// finished writing to the wav.
m_cpVoice^.WaitUntilDone(INFINITE);
cpWavStream.Release();

// Reset output
m_cpVoice^.SetOutput(cpOldStream, FALSE);
end;
end;
end;

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧