中国开发网: 论坛: 程序员情感CBD: 贴子 193467
UnKnow365
完成了
要安装微软TTS中文引擎(1.6M左右),怎么倒入到Delphi就不说了,网上多的是。
在窗体上放一个SPvoice控件,再放个Button,在ButtonClick事件里加如下代码!
AnalyseSpeak('测试中英文混读Are you OK你好!And you谢谢!')
试试。

procedure TForm1.Speak(strSpeack:string);
begin
try
// voice.Speak(strSpeack,SpeechVoiceSpeakFlags.SVSFlagsAsync) ;
SpVoice1.Speak(strSpeack,0);//SVSFlagsAsync);
except
//throw(new Exception("发生一个错误:"+err.Message)) ;
end;

end;

procedure TForm1.SpeakChinese(strSpeak: string);
begin
SpVoice1.Voice := SpVoice1.GetVoices('Language = 804','').Item(0);//Language = 804好象可以不要
// SpVoice1.Volume := 100;//音量,最大好象只能100--最高
// SpVoice1.Rate := 5;//语速,最大好象只能是8--最快
SpVoice1.Speak(strSpeak,0);
end;

procedure TForm1.SpeakEnglish(strSpeak: string);
begin
SpVoice1.Voice := SpVoice1.GetVoices('Language = 409','').Item(1);
// SpVoice1.Volume := 100;
// SpVoice1.Rate := 8;
SpVoice1.Speak(strSpeak,0);
end;

procedure TForm1.AnalyseSpeak(strSpeak:string);
var
iCbeg,iEbeg,iLen,i,l,k : Integer;
IsChina : Boolean;
StrValue,sTemp : string;
cTemp : Char;
begin
iCbeg := 1;
iEbeg := 1;
IsChina := True;
l := Length(StrSpeak);
for i :=1 to l do
begin
cTemp := StrSpeak[i];
k := Ord(cTemp);
if IsChina then
begin
// if ((k<=122) and (k>=65)) then
if (k<=122) then
begin
iLen := i - iCbeg;
strValue := Copy(StrSpeak,iCbeg,iLen);
SpeakChinese(strValue) ;
iEbeg := i ;
IsChina := False ;
end;
end
else
begin
// if ((k>122) or (k<65)) then
if (k>122) then
begin
iLen := i - iEbeg;
strValue := Copy(StrSpeak,iEbeg,iLen);
SpeakEnglish(strValue) ;
iCbeg := i ;
IsChina := True ;
end;
end;
end;

if (IsChina) then
begin
iLen := l - iCbeg -1;
strValue := Copy(StrSpeak,iCbeg,iLen) ;
SpeakChinese(strValue) ;
end
else
begin
iLen := l - iEbeg -1;
StrValue := Copy(StrSpeak,iEbeg,iLen) ;
SpeakEnglish(strValue) ;
end;
end;
日出东海落西山,愁也一天,喜也一天;遇事不钻牛角尖,人也舒坦,心也舒坦。

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录