2010-06-13 9 views
11

Her şeyden önce: Bu bir Delphi and SAPI kopyası değil. "Delphi in Delphi" konusundaki özel bir problemim var.Delphi SAPI Text-To-Speech

Bileşen paletinde bir TSpVoice bileşeni almak için Delphi 2009'daki mükemmel Import Type-Library kılavuzunu kullandım. Bu harika çalışıyor.

var 
    SpVoice: TSpVoice; 

ile ben

SpVoice.Speak('This is an example.', 1); 

asenkron ses çıkışını almak için yazabilirsiniz.

İlk soru

belgelerine göre, ben

SpVoice.Speak('This is an example.', 0); 

senkron ses çıkışını almak için yazmak mümkün olacaktır, ama bunun yerine bir EZeroDivide istisna olsun. Nedenmiş?

İkinci soru

Ama daha önemlisi, ben, (Ben buna "geç-bağlama" SpVoice nesne denir düşünüyorum) dinamik olarak SpVoice nesne oluşturmak mümkün olmak istiyorum kısmen çünkü sadece Uygulamamdaki tüm oturumların çok küçük bir kısmı bunu kullanacak ve kısmen de SAPI sunucusunun son kullanıcının sisteminde varlığını sürdürmek istemediğimden. Bu amaçla

, ben

görünüşte hiç bir şey yapmaz
procedure TForm1.FormClick(Sender: TObject); 
var 
    SpVoice: Variant; 
begin 
    SpVoice := CreateOleObject('SAPI.SpVoice'); 
    SpVoice.Speak('this is a test', 0); 
end; 

çalıştı! (0 1 ile değiştirilmesi bana EZeroDivide istisna verir.)

Yasal Uyarı

Ben COM/OLE otomasyonu için oldukça yeni. Yaptığım aynı sorunla karşılaşmış herkesin yararına

Güncelleme

... bu yazı bana gösterdiği herhangi cehalet veya aptallık için üzgünüm, François video SAPI bir hata var açıkladı video tarafından sunulan FPU kontrol kelimesini değiştirmek için,

procedure TForm1.FormClick(Sender: TObject); 
var 
    SpVoice: variant; 
begin 
    SpVoice := CreateOleObject('SAPI.SpVoice'); 
    SpVoice.Speak('This is a text.'); 
end; 

çözüm olduğunu:

procedure TForm1.FormClick(Sender: TObject); 
var 
    SpVoice: variant; 
    SavedCW: Word; 
begin 
    SpVoice := CreateOleObject('SAPI.SpVoice'); 
    SavedCW := Get8087CW; 
    Set8087CW(SavedCW or $4); 
    SpVoice.Speak('This is a text.'); 
    Set8087CW(SavedCW); 
end; 
aşağıdaki kodu yapar/Windows (bazı uyumsuzluk yerde), EZeroDivide istisna yükseltmek

Ayrıca, bir sesi eşzamansız olarak çalmak istiyorsanız, o zaman oyuncunun kapsama alanı dışında kalmamasını sağlamalısınız!

cevap

4

"Speech Enabling Delphi Applications (zip)" numaralı telefondan this CodeRage 4 session'u incelemek için ilginç bulabilirsiniz "Nasıl yapılır" konusuna bakın ... (ve sanırım sıfır bölme olarak Vista'da ya da + üzerindeydiniz XP'de olmadı)

+0

Ah, çok teşekkür ederim! O zaman sadece aptal olmadı o zaman! –

+0

BTW: Video için kredi almak istiyorsanız isminizin yanındaki soru işaretini kaldırmaktan çekinmeyin! :) –

1

Delphi XE2'de aynı sorunu yaşıyordum. Soruda sunulan Set8087CW(SavedCW or $4) çözümü benim için çalışmadı. Yalnızca bir başka kayan nokta istisnasıyla sıfır istisnasıyla bölünmenin yerini aldı.

Benim için çalışma yaptı şudur:

SavedCW := Get8087CW; 
SetFPUExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]); 
SpVoice.Speak('All floating point exceptions disabled!', 0); 
Set8087CW(SavedCW);