البرمجيات التلقائية الفم - مزج الكلام الصغير
هذا هو منفذ GO لملف الكلام العظيم سام. إنها في الأساس إعادة كتابة شبه آلية من C إلى الذهاب ، بدورها ، إعادة كتابة شبه آلية من التجميع إلى C :). وبالتالي ، فإن هذا ليس من المفترض أن يكون قابلاً للقراءة.
repo الأصلي: https://github.com/vidarh/sam. بناء على هذا الالتزام.
كتحدي وفقط للمتعة.
SAM هو برنامج صغير جدًا للنص إلى كلام (TTS) مكتوب في C ، والذي يعمل على المنصات الأكثر شعبية. إنه تكيف مع C لبرنامج الكلام SAM (Software Automatic Mouth) لـ Commodore C64 المنشور في عام 1982 بواسطة Dont Ask Software (Now SoftVoice ، Inc.). ويتضمن محولًا من نص إلى فنيم يسمى Reciter وروتين صوتي إلى كلام للإخراج النهائي. إنه صغير جدًا لدرجة أنه سيعمل أيضًا على أجهزة الكمبيوتر المضمنة. على جهاز الكمبيوتر الخاص بي ، يستغرق الأمر أقل من 39 كيلو بايت (أصغر بكثير على الأجهزة المدمجة حيث أن الرؤوس القابلة للتنفيذ ليست ضرورية) لمساحة القرص وهو برنامج مستقل تمامًا. بالنسبة للإخراج الفوري ، فإنه يستخدم SDL-Library ، وإلا فإنه يمكن أن يحفظ ملفات .wav.
يمكن العثور على إصدار عبر الإنترنت وتنفيذيات لنظام التشغيل Windows على موقع الويب: http://simulationcorner.net/index.php؟page=sam
ببساطة اكتب "اجعل" في موجه الأوامر. من أجل تجميع بدون SDL ، قم بإزالة عبارات SDL من متغيرات CFLAGS و LFLAGS في الملف "Makefile".
يجب أن يتم تجميعها على كل نظام تشغيل يشبه UNIX. بالنسبة لنظام التشغيل Windows ، تحتاج إلى cygwin أو mingw ( + libsdl).
يكتب
./sam I am Sam
للإخراج الأول.
إذا كنت قد عطلت SDL حاول
./sam -wav i_am_sam.wav I am Sam
للحصول على ملف WAV. يمكن تشغيل هذا الملف من قبل العديد من مشغلات الوسائط المتاحة للكمبيوتر.
يمكنك تجربة خيارات أخرى مثل -رقم pitch -ped number -الرقم الحلم -رقم الوثني
بعض القيم النموذجية المكتوبة في الدليل الأصلي هي:
DESCRIPTION SPEED PITCH THROAT MOUTH
Elf 72 64 110 160
Little Robot 92 60 190 190
Stuffy Guy 82 72 110 105
Little Old Lady 82 32 145 145
Extra-Terrestrial 100 64 150 200
SAM 72 64 128 128
يمكن أن يغني حتى إلقاء نظرة على ملف "الغناء" للحصول على مثال صغير.
للحصول على جدول إدخال Phoneme ، انظر في الويكي.
يمكن العثور على وصف لميزات إضافية في الدليل الأصلي على http://www.retrobits.net/atari/Sam.shtml أو في دليل برنامج Apple II المكافئ http://www.apple-iigs.info/newdoc/sam.pdff
تم تحويل هذا البرنامج شبه التلقائي إلى C عن طريق تحويل كل رمز opcode. على سبيل المثال
lda 56 => A = mem[56];
jmp 38018 => goto pos38018;
inc 38 => mem[38]++;
. .
. .
ثم تم إعادة كتابة يدويًا لإزالة معظم القفزات وتسجيل المتغيرات في الكود وإعادة تسمية المتغيرات إلى الأسماء المناسبة. معظم الوصف أدناه هو نتيجة لعملية إعادة الكتابة هذه.
لسوء الحظ ، لا يزال غير قابل للقراءة جيدًا. لكن يجب أن ترى أين بدأت :)
بادئ ذي بدء ، سوف أقصر نفسي هنا على وصف خشن للغاية. هناك العديد من الاستثناءات المحددة في الكود المصدري الذي لن أشرحه. أيضا الكثير من التعليمات البرمجية غير معروفة بالنسبة لي eg code47503. لفهم كامل للرمز ، أحتاج إلى مزيد من الوقت ، وخاصة المزيد من العيون لإلقاء نظرة على الرمز.
يغير النص الإنجليزي إلى الصوتيات بواسطة مجموعة قواعد مبينة في الويكي.
القاعدة "Ant (I)" ، "AY" ، تعني أنه إذا وجد "I" مع الحروف السابقة "Ant" ، وتبادل I by the phoneme "ay".
هناك بعض العلامات الخاصة في هذه القواعد مثل # & ^ +: ٪ والتي يمكن أن تعني على سبيل المثال أنه يجب أن يكون هناك صوتي أو ساكن أو أي شيء آخر.
مع خيار -debug ، ستحصل على القواعد المقابلة والصوتيات الناتجة.
هذه هي الشجرة الكاملة لمكالمات الروتين الفرعي:
sammain () parser1 () parser2 () insert () copystress () setphonemelength () code48619 () code41240 () insert () code48431 () insert ()
Code48547
Code47574
Special1
Code47503
Code48227
Sammain () هو روتين الدخول ويدعو جميع الروتينات الإضافية. يحول Parser1 إدخال Phoneme ويحوله إلى ثلاثة جداول PhonemeIndex [] الإجهاد []
تم تغيير هذه الجداول الآن:
Parser2 يتبادل بعض الصوتيات من قبل الآخرين ويدرج جديد. يضيف Copystress 1 إلى الإجهاد في بعض الحالات التي يضع setphonemelength أطوال الصوت. Code48619 يغير الأطوال الصوتية Code41240 يضيف بعض الصوتيات الإضافية Code48431 لديه بعض القواعد الإضافية
يظهر الويكي جميع الصوتيات الممكنة وبعض حقول العلم.
يمكن رؤية المحتوى النهائي لهذه الجداول مع أمر -debug.
في الوظيفة ، يتم نسخ هذه الجداول جزئيًا إلى الجداول الصغيرة: phonemeindexoutput [] الإجهاد الإجهاد [] phonemelengthoutput [] للإخراج.
باستثناء بعض الصوتيات الخاصة ، يتم إنشاء الإخراج من خلال مزيج خطي:
A = A1 * sin ( f1 * t ) +
A2 * sin ( f2 * t ) +
A3 * rect( f3 * t )
حيث المستقيم وظيفة مستطيلة مع نفس الدورية مثل الخطيئة. يبدو غريباً حقًا ، لكن هذا يكفي حقًا لمعظم أنواع الصوتيات.
لذلك يتم تحويل الصوتيات أعلاه مع بعض الجداول إلى الملاعب [] التردد 1 [] = F1 التردد 2 [] = F2 التردد 3 [] = F3 Amplitude1 [] = A1 Amplitude2 [] = A2 Amplitude3 [] = A3
يتم حساب الصيغة أعلاه في روتين واحد جيد جدًا. تتكون فقط من 26 أمرًا:
48087: LDX 43 ; get phase
CLC
LDA 42240,x ; load sine value (high 4 bits)
ORA TabAmpl1,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
STA 56 ; store
LDX 42 ; get phase
LDA 42240,x ; load sine value (high 4 bits)
ORA TabAmpl2,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
ADC Var56 ; add with previous values
STA 56 ; and store
LDX 41 ; get phase
LDA 42496,x ; load rect value (high 4 bits)
ORA TabAmpl3,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
ADC 56 ; add with previous values
ADC #136
LSR A ; get highest 4 bits
LSR A
LSR A
LSR A
STA 54296 ;SID main output command
يتم التعامل مع الباقي بطريقة خاصة. في الوقت الحالي ، لا يمكنني معرفة بأي طريقة. ولكن يبدو أنه يستخدم بعض الضوضاء (مثل "S") باستخدام جدول ذي قيم عشوائية.
البرنامج عبارة عن نسخة مخزنة من برنامج تجاري نُشر منذ أكثر من 30 عامًا. حامل حقوق الطبع والنشر الحالي هو SoftVoice ، Inc. (www.text2speech.com)
فشلت أي محاولة للاتصال بالشركة. تم تحديث الموقع آخر مرة في عام 2009. وبالتالي يمكن وصف حالة البرنامج الأصلي بأنها التخلي عن البرامج (http://en.wikipedia.org/wiki/abandonware)
طالما كان هذا هو الحال ، لا يمكنني وضع الكود الخاص بي تحت أي ترخيص محدد للبرنامج مفتوح المصدر ، استخدمه على مسؤوليتك الخاصة.
إذا كانت لديك أسئلة لا تتردد في طرحها. إذا اكتشفت بعض المعرفة الجديدة حول الرمز ، يرجى إرسال بريد إلكتروني لي.
البريد الإلكتروني سيباستيان ماكي: [email protected]