2010-06-13 13 views
11

सबसे पहले: यह Delphi and SAPI का डुप्लिकेट नहीं है। मुझे "डेल्फी में एसएपीआई" विषय के साथ एक विशिष्ट समस्या है।डेल्फी एसएपीआई टेक्स्ट-टू-स्पीच

मैंने घटक पैलेट में एक टीएसपीवीइस घटक प्राप्त करने के लिए डेल्फी 200 9 में उत्कृष्ट आयात प्रकार-पुस्तकालय मार्गदर्शिका का उपयोग किया है। यह बहुत अच्छा काम करता है।

var 
    SpVoice: TSpVoice; 

के साथ मैं

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

अतुल्यकालिक ऑडियो आउटपुट प्राप्त करने के लिए लिख सकते हैं।

पहला सवाल

प्रलेखन के अनुसार, मैं

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

तुल्यकालिक ऑडियो आउटपुट प्राप्त करने के लिए लिखने के लिए सक्षम हो जाएगा, लेकिन इसके बजाय मैं एक EZeroDivide अपवाद मिलता है। यही कारण है कि?

दूसरा सवाल

लेकिन अधिक महत्वपूर्ण बात, मैं, (मुझे लगता है कि यह करने के लिए "देर बाँध" SpVoice वस्तु कहा जाता है) को गतिशील SpVoice वस्तु बनाने के लिए सक्षम होने के लिए चाहते हैं आंशिक रूप से की वजह से ही मेरे ऐप के सभी सत्रों का एक बहुत ही छोटा हिस्सा इसका उपयोग करेगा, और आंशिक रूप से क्योंकि मैं एंड-यूजर सिस्टम पर एसएपीआई सर्वर के अस्तित्व को नहीं मानना ​​चाहता हूं।

इस उद्देश्य से, मैं

procedure TForm1.FormClick(Sender: TObject); 
var 
    SpVoice: Variant; 
begin 
    SpVoice := CreateOleObject('SAPI.SpVoice'); 
    SpVoice.Speak('this is a test', 0); 
end; 

जो जाहिरा तौर पर कुछ भी नहीं करता है की कोशिश की! (जगह 0 1 के साथ मुझे EZeroDivide अपवाद देता है।)

अस्वीकरण

मैं नहीं बल्कि कॉम/OLE स्वचालन के लिए नया हूँ। मैं किसी भी अज्ञानता या मूर्खता इस पोस्ट में मेरे द्वारा दिखाए गए के लिए माफी चाहता हूँ ...

अद्यतन

एक ही समस्या का सामना कर के रूप में मैंने किया था हर किसी के लाभ के लिए, फ़्राँस्वा द्वारा वीडियो बताये SAPI में एक बग है

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; 
: एफपीयू नियंत्रण शब्द को बदलने के लिए के रूप में वीडियो द्वारा प्रस्तुत,

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

समाधान, है:/विंडोज (कुछ असंगति कहीं) है, जो निम्नलिखित कोड बनाता है EZeroDivide अपवाद बढ़ा

और, इसके अतिरिक्त, यदि आप एक ध्वनि को अतुल्यकालिक रूप से खेलना चाहते हैं, तो आपको यह सुनिश्चित करना होगा कि खिलाड़ी गुंजाइश से बाहर न जाए!

उत्तर

4

this CodeRage 4 session"Speech Enabling Delphi Applications (zip)" पर आपको दिलचस्प लगता है कि आप "कैसे-कैसे" ढूंढ रहे हैं ... (और मुझे लगता है कि आप Vista पर हैं या + जैसे शून्य विभाजन को एक्सपी पर खुशी नहीं मिली है)

+0

आह, बहुत बहुत धन्यवाद! तो यह बस मुझे बेवकूफ नहीं था, तो! –

+0

बीटीडब्ल्यू: अगर आप वीडियो के लिए क्रेडिट लेना चाहते हैं तो अपने नाम के बगल में प्रश्न चिह्न को हटाने के लिए स्वतंत्र महसूस करें! :) –

1

मुझे डेल्फी XE2 में एक ही समस्या थी। प्रश्न में प्रस्तुत Set8087CW(SavedCW or $4) समाधान मेरे लिए काम नहीं करता था। यह केवल दूसरे अपवाद बिंदु अपवाद के साथ विभाजन को शून्य अपवाद से बदल दिया।

यह क्या मेरे लिए काम किया है:

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