在TTs中怎样随着朗读将文本框里的相应文字加亮? (200分)

  • 主题发起人 qiyuanwj
  • 开始时间
Q

qiyuanwj

Unregistered / Unconfirmed
GUEST, unregistred user!
在TTs中怎样随着朗读将文本框里的相应文字加亮?就是处理SpVoice控件的OnWord事件。
最好能将Demo里用VB或C编写的TTsapp程序翻译成Delphi发给我,还有如何将spvoice和相关控件打包发布?先谢过了。200分大赠送!![:)]
 
已经好几天了,没人回答我,这个问题真的很难很难码???[:(]
 
这个问题难,难的是没有人在使用这个功能,它需要俘获 SPVOICESTATUS 。
试试使用下面函数
HRESULT GetStatus(
SPVOICESTATUS *pStatus,
WCHAR **ppszLastBookmark
);
来得到这个结构中的成员,结构如下:
typedef struct SPVOICESTATUS
{
ULONG ulCurrentStream;
ULONG ulLastStreamQueued;
HRESULT hrLastResult;
DWORD dwRunningState;
ULONG ulInputWordPos;
ULONG ulInputWordLen;
ULONG ulInputSentPos;
ULONG ulInputSentLen;
LONG lBookmarkId;
SPPHONEID PhonemeId;
SPVISEMES VisemeId;
DWORD dwReserved1;
DWORD dwReserved2;
} SPVOICESTATUS;
得到 ulInputWordPos 和 ulInputWordLen 就可以使用类似下面的代码:
nStart = 0;
nEnd = SendDlgItemMessage( m_hWnd, IDE_EDITBOX, WM_GETTEXTLENGTH, 0, 0 );
SendDlgItemMessage( m_hWnd, IDE_EDITBOX, EM_SETSEL, nStart, nEnd );
或 Delphi 的 SetStart ,CaretPos ,SelLength 等函数。
呵呵,我有点吃不消。仅供参考。
 
试试这段代码,写得不好,没有深入研究,意思算是到了。呵呵。
本例专门针对中文的,如果是英文,SelLength:=SizeOf(Char)吧。
procedure TForm1.Button1Click(Sender: TObject);
begin

SpVoice1.Speak(memo1.Lines.Text,1);
Memo1.SetFocus;
Memo1.SelStart := 0;
Memo1.SelLength := SizeOf(WideChar);
end;


procedure TForm1.SpVoice1Word(Sender: TObject;
StreamNumber: Integer;
StreamPosition: OleVariant;
CharacterPosition, Length: Integer);
begin

Memo1.SetFocus;
Memo1.SelStart := CharacterPosition+SizeOf(WideChar);
Memo1.SelLength := SizeOf(WideChar);
end;


procedure TForm1.SpVoice1EndStream(Sender: TObject;
StreamNumber: Integer;
StreamPosition: OleVariant);
begin

Memo1.SelStart :=0;
end;

至于发布你的产品,可以到 MS 下一个运行时包,具体地址我这里网速不行,你自己找找,
下载后和你的产品一起发布。
 

学习中..........
 
接受答案了.
 
顶部