Delphi实现中英文混合发声源代码 ( 积分: 0 )

  • 主题发起人 主题发起人 UnKnow365
  • 开始时间 开始时间
U

UnKnow365

Unregistered / Unconfirmed
GUEST, unregistred user!
近阶段做个网络简单监控程序,想做成文本-语音报警。在网上(包括本坛)找了不少资料均无Delphi的详细例子(更有甚者还要什么...)。参考一个C#程序改成Delphi的。基本达到目的,公布在此有需要的拿去修改(完善后要是能发一份代码给我就分感谢了!)。
要安装微软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 ldo

begin

cTemp := StrSpeak;
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;
 
近阶段做个网络简单监控程序,想做成文本-语音报警。在网上(包括本坛)找了不少资料均无Delphi的详细例子(更有甚者还要什么...)。参考一个C#程序改成Delphi的。基本达到目的,公布在此有需要的拿去修改(完善后要是能发一份代码给我就分感谢了!)。
要安装微软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(&quot;发生一个错误:&quot;+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 ldo

begin

cTemp := StrSpeak;
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;
 
www.ysza.com tts中文发音
 
后退
顶部