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 yapmazprocedure 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!
Ah, çok teşekkür ederim! O zaman sadece aptal olmadı o zaman! –
BTW: Video için kredi almak istiyorsanız isminizin yanındaki soru işaretini kaldırmaktan çekinmeyin! :) –