سؤال

بادئ ذي بدء: هذا ليس مكررًا دلفي و SAPI. لدي مشكلة محددة مع موضوع "SAPI in Delphi".

لقد استخدمت دليل المكتبة الممتازة للاستيراد في Delphi 2009 للحصول على مكون TSPVoice في لوحة المكونات. هذا يعمل بشكل رائع. مع

var
  SpVoice: TSpVoice;

أستطيع أن أكتب

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

للحصول على غير متزامن مخرج الصوت.

السؤال الأول

وفقًا للوثائق ، سأكون قادرًا على الكتابة

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

للحصول على متزامن إخراج الصوت ، ولكن بدلاً من ذلك أحصل على استثناء Ezerodivide. لماذا هذا؟

السؤال الثاني

ولكن الأهم من ذلك ، أود أن أكون قادرًا على إنشاء كائن SPVoice ديناميكيًا (أعتقد أن هذا يسمى "كائن SPVoice المتأخر") ، جزئياً لأن جزءًا صغيرًا جدًا من جميع جلسات تطبيقي سوف يستخدمه ، وجزئياً لأنني لا أريد أن أتحمل وجود خادم SAPI على نظام المستخدم النهائي.

تحقيقا لهذه الغاية ، حاولت

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

الذي يبدو أنه لا يفعل شيئًا على الإطلاق! (استبدال 0 مع 1 يعطيني استثناء Ezerodivide.)

تنصل

أنا جديد على الأتمتة Com/Ole. أنا آسف لأي جهل أو غباء أظهره لي في هذا المنشور ...

تحديث

لصالح كل شخص يواجه نفس المشكلة كما فعلت ، أوضح مقطع الفيديو من قبل François أن هناك خطأ في SAPI/Windows (بعض عدم التوافق في مكان ما) ، مما يجعل الكود التالي يرفع استثناء Ezerodivide:

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

الحل ، كما قدمه الفيديو ، هو تغيير كلمة التحكم في FPU:

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;

بالإضافة إلى ذلك ، إذا كنت ترغب في تشغيل صوت بشكل غير متزامن ، فعليك التأكد من أن اللاعب لا يخرج عن النطاق!

هل كانت مفيدة؟

المحلول

قد تجد مثيرة للاهتمام لرؤية هذه الجلسة 4 coderage على "الكلام تمكين تطبيقات دلفي (ZIP)"ستحصل على "كيفية" الذي تبحث عنه ... (وأعتقد أنك على Vista أو + لأن الفجوة الصفر لم تسعد على XP)

نصائح أخرى

كنت أواجه نفس المشكلة في Delphi XE2. ال Set8087CW(SavedCW or $4) الحل المقدم في السؤال لم ينجح بالنسبة لي. لقد استبدلت القسم فقط باستثناء صفر باستثناء نقطة عائمة أخرى.

ما الذي نجح بالنسبة لي هو:

SavedCW := Get8087CW;
SetFPUExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]);
SpVoice.Speak('All floating point exceptions disabled!', 0);
Set8087CW(SavedCW);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top