PDA

نسخه کامل مشاهده نسخه کامل : |||ساخت يك شبيه‌ساز گفتار با Flash Mx|||



Babak_King
22-12-2005, 11:08
اشاره :
كاربردهاي نرم‌افزار محبوب فلش بسيار وسيع‌تر از توليد انيميشن‌ يا قطعات تعاملي براي استفاده در وب‌سايت‌ها مي‌تواند باشد. نسخه‌هاي اخير اين نرم‌افزار قابليت‌هاي بسيار پيشرفته‌اي را در اختيار كاربران حرفه‌اي فلش قرار داده است. در اين نوشته چگونگي ساخت يك شبيه‌ساز گفتار يا سينتي‌سايزر به‌كمك امكانات جديد و پيشرفته فلش MX تشريح شده است. امروزه ماشين‌هاي شبيه‌ساز گفتار، در گوشه و‌‌كنار به وفور ديده مي‌شوند. سيستم‌هاي سخن‌گوي بانك‌ها كه موجودي مشتريان را به‌كمك صداي شبيه‌سازي شده انسان به اطلاع كاربران مي‌رسانند و يا كاربرد بسيار عمومي‌تر نظير اپراتور تلفن‌همراه و ساعت گويا و غيره همگي نمونه‌هايي از سيستم‌هاي سينتي‌سايزر محسوب مي‌شوند. شما مي‌توانيد با تعقيب روش‌هاي ارائه شده در اين نوشته و گسترش اين پروژه، مهارت‌ و خلاقيت خود را براي يافتن كاربردهاي ديگر چنين سيستمي بيازماييد.


در نسل قبل از فلش MX، (يعني نسخه 5‌) برنامه‌نويسان ActionScript براي كنترل قطعات صوتي ناگزير به استفاده از روش‌هاي مبتني‌بر Keyframe/onEnterFrame بودند. در نسل جديد اين نرم‌افزار، اضافه شدن متد Sound.onSoundComplete امكان كنترل بسيار دقيقتر صدا‌ها را ميسر ساخته است. دقت رويدادonSoundComplete در حدود يك دهم سرعت فريم است. بدين ترتيب در صورتي‌كه پروژه فلش شما براي سرعت متداول 12 فريم در ثانيه تنظيم شده باشد، آنگاه دقت رويداد فوق در حدود يك صد و بيستم ثانيه خواهد بود كه براي كاربرد مورد نظر ما در اين نوشته بسيار مناسب است.

كد 1

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

در اين‌جا بد نيست كه از ابتدا نكته‌اي را يادآوري كنيم تا ذهنيت دقيق‌تري از حاصل كار داشته باشيد. رويداد onSoundComplete هم، مانند ديگر رويدادهاي فلش، در صورتي‌كه عمليات پيچيده و سنگيني همزمان با آن در جريان باشد (مانند انيميشن‌هاي سنگين) ممكن دچار تاخير‌هاي كوتاهي بشود. در نتيجه در زمان بخش صدا، ممكن است Flash player نتواند تمام عمليات بارگذاري شده را با همان دقت مورد نظر شما انجام دهد و نهايتاً احتمال ايجاد تأخير‌هاي ناخواسته به‌صورت "سكته" وجود دارد. اين مسأله كاملاً به قدرت و سرعت پردازنده سيستم مقصد بستگي دارد و در سيستم‌هاي قديمي‌تر تبديل به مسأله‌اي كاملاً جدي خواهد شد. (حالا‌ نظري به كد شماره يك بيندازيد).
براي آن‌كه بتوانيد كد فوق را آزمايش كنيد، بايد يك فايل صوتي در كتابخانه وارد كرده باشيد و نام groovy را براي آن انتخاب كنيد. براي اين‌كار بعد از آن كه يك فايل صوتي نمونه ساختيد، از طريق منوي فايل و گزينهImport to library ، اين فايل را به‌درون محيط فلش وارد كنيد. در مرحله بعدي بر روي فايل صوتي خود كه در پنجره كتابخانه بايد ديده شود، كليك راست كنيد و از منويي كه ظاهر مي‌شود، گزينه Linkage را انتخاب نماييد(شكل 1).

شكل 1

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

با انتخاب گزينه Linkage، پنجره ديگري ظاهر مي‌شود كه مي‌توانيد پارامتر‌هاي مورد نظر خود را در آن تنظيم كنيد. در اين پروژه ما بايد نام groovy را در اين پنجره تايپ كنيم. (براي آن‌كه جعبه متني مورد نظر فعال شود بايد گزينه Export for ActionScript را تيك بزنيد. با اين‌كار گزينه ديگر Export in the first frame هم فعال خواهد شد كه در كاربرد ما بايد چنين باشد.) اين وضعيت در شكل 2 نمايش داده شده است. توجه داشته باشيد كه با اين عمل، از اين به بعد مي‌توانيد در كد‌هاي خود با قرار دادن نام اين قطعه صوتي در درون علامت‌هاي "" به آن ارجاع كنيد.

در زمان كامپايل شدن پروژه و توليد فايل‌هاي swf، نرم‌افزار فلش مراقب تمام سمبل‌هاي مورد استفاده خواهد بود و متصل بودن (Attach) آنها به timeline را زير نظر دارد و بر همين اساس محتواي پروژه در فايل swf چيده مي‌شوند. در نتيجه زماني كه فايل swf در شبكه‌اي نظير اينترنت جريان مي‌يابد، محتواي پروژه و در واقع همان سمبل‌ها يكي يكي بر اساس همان ترتيب چيده شده توسط نرم‌افزار Flash player بارگذاري مي‌شوند.

سمبل‌هايي كه فقط با اسكريپت بهtimeline متصل شده باشند، به‌طور پيش‌فرض توسط فلش در زمان كامپايل شدن ديده نمي‌شوند و در فايل swf قرار نمي‌گيرند. در واقع فلش به‌صورت پيش‌فرض تصور مي‌كند كه چنين سمبل‌هايي بي‌استفاده بوده‌اند. گزينه‌هاي Export in first frame و Export for Actionscript براي جبران اين موضوع تنظيم مي‌شوند. به اين ترتيب به فلش يادآوري مي‌شود كه سمبل‌ها از طريق اسكريپت مورد استفاده قرار گرفته‌اند و بايد در فايل كامپايل شده swf گنجانده شوند.


شكل 2

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

در قطعه كد يك، قطعه صدايي با نام groovy توسط اسكريپت بهInstance صدايي به‌‌نام myLoop متصل شده است. در زمان اجرا شدن پروژه، وقتي كه پخش صداي myLoop پايان مي‌پذيرد، رويداد onSoundComplete تابع nextSound را فرامي‌خواند كه اين عمل باعث پخش مجدد صدا خواهد شد.



در اينجا ممكن است با خود فكر كنيد، كه‌انجام اين‌كارها براي چيست؟ زيرا اين‌كار را مي‌توانستيم به‌صورت سر راست‌تري يعني همان‌طو كه در كد 2 آمده، هم انجام دهيم.

كد 2

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

در اين روش، ترتيبي داده شده است كه صدايgroovy به تعداد هزار مرتبه پشت سر هم پخش شود.
ويژگي‌اي كه رويداد OnSoundComplete را متمايز مي‌سازد، ذات ديناميك آن است. به اين معني كه كاربر مي‌تواند در هر زمان دلخواهي، صدا را تغيير دهد و با اين روش پروژه‌هايي مانند ميكسر‌هاي صوتي طراحي كند. (بدين صورت كه تابع بازگشتي، (در اينجا ()nextSound ) مي‌تواند در پايان هر قطعه صدايي، صداي ديگري را راه‌اندازي كند.)

سينتي‌سايزر نرم‌افزاري با فلش
نمي‌دانم آيا تاكنون به نرم‌افزارهاي ويژه‌اي كه براي كاربران كم‌بينا طراحي شده‌اند، نگاهي انداخته‌ايد يا نه؟ (در ويندوز اين قابليت تحت عنوان تنظيمات Accessability وجود دارد.بعضي از سايت‌هاي ويژه وب هم به منظور قابل استفاده بودن براي كاربران خاص، به چنين مكانيسم‌هايي مجهز هستند. همچنين ابزارهايي وجود دارند كه در صورت عدم پشتيباني سايت از قابليت‌هاي فوق، باز هم با ارائه خدماتي آنرا براي كاربران خاص قابل استفاده مي‌كند.) اين نرم‌افزارها وظيفه دارند تا بخش‌هايي از صفحه نمايش را كه در نزديكي اشاره‌گر ماوس قرار مي‌گيرند را بزرگ‌تر نمايش داده و ضمناً در صورت وجود متن در آن بخش‌ها، آن‌را به‌صورت صوتي ادا كند. به‌طور معمول حجم چنين سينتي‌سايزر‌هاي نرم‌افزاري از چند مگابايت كمتر نيست. اما ما مي‌خواهيم به‌كمك فلش ابزار بسيار جمع و جوري بسازيم كه كارايي نسبتاً خوبي در مقايسه با نمونه‌هاي تجاري داشته باشد.

سيستم‌هاي قديمي commodore 64 و حتي Atary آتاري با آنكه پردازنده‌هاي بسيار ضعيفي (در قياس با نمونه‌هاي امروزي) داشتند و كل حافظه آنها 64 كيلو بايت بود (آتاري 32 كيلو بايت حافظه داشت)، قابليت‌هاي سينتي‌سايزر را به‌خوبي به‌نمايش مي‌گذاشتند. رمز موفقيت چنين سيستم‌هايي در آن بود كه از تركيب قطعات بسيار كوچك صداي انسان كه از پيش در حافظه سيستم وجود داشت و allophone نام داشت، استفاده مي‌شدallophone ها اصواتي نظير صداي "ou" يا "th" بودند. بدين ترتيب نرم‌افزارهاي ساده و ابتدايي كه بر روي سيستم‌هايي مانند كمودر 64 اجرا مي‌شد، قادر بودند تركيبات متني را تجزيه كرده و با چيدن آلوفن‌ها در كنار يكديگر، گفتار صوتي را به‌خوبي شبيه‌سازي كنند. چرا ما اين‌كار را با در اختيار داشتن رويداد onSoundComplete در فلش انجام ندهيم؟

تنها مشكل شما تهيه آلوفن خواهد بود. براي اين‌كار چندين راه‌حل پيش‌روي شما قرار دارد. يكي از ساده‌ترين راه‌حل‌ها، جستجو در اينترنت است. براي اين‌كار مي‌توانيد از عباراتي نظير "speech emulation" يا "allophone" در موتورهاي جستجو استفاده كنيد. (سايت [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] تعدادي زيادي از نشاني‌هاي شبيه‌سازها ياemulator را مي‌تواند برايتان بيابد).

البته در اينترنت تعداد پروژه‌هاي سينتي‌سايزر سخت‌افزاري كه به‌كمك پردازنده‌هاي بسيار كوچك (مثلاًPIC كه در بازار ايران نيز به‌وفور يافت مي‌شود) قابل ساخت هستند، فراوان هستند. به‌طور معمول در اين نوع پروژه‌هاي سخت‌افزاري، آلوفن‌ها به‌صورت فايل تهيه مي‌شوند و در درون حافظه‌هاي ويژه‌اي (مثلاً EEPROM) ذخيره مي‌شوند. شما در‌صورتي‌كه كمي حوصله داشته باشيد خواهيد توانست از فايل‌هاي آماده چنين پروژه‌هايي نيز استفاده كنيد. نشاني يكي از اين سايت‌ها چنين است: [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

روش دوم و شايد هم روش بهتر تهيه آلوفن‌ها، آن است كه خودتان دست به‌كار شويد و آلوفن‌هاي مورد نياز خود را ضبط كنيد. در اين صورت اگرچه ممكن است به‌علت كم تجربگي، نتيجه اوليه چندان رضايت‌بخش نباشد، اما در عوض آلوفن‌هاي فارسي در دست خواهيد داشت. (اين مطلب كه آيا تاكنون آلوفن‌هاي فارسي تهيه شده باشند، موضوعي است كه در حال حاضر بر نويسنده مشخص نيست.)

بازگشت به فلش

منشا فايل‌هاي آلوفن هرچه باشد، بايد آنها را به‌درون فلش وارد (Import) كنيد. يادآوري مي‌كنيم كه براي به‌دست آوردن نتيجه بهتر لازم است كه فايل‌هاي آلوفن، داراي هيچ گونه سكوت اضافي در ابتدا و انتهاي خود نباشند. براي اطمينان از اين مسأله مي‌توانيد از نرم‌افزارهاي ويرايشگر صوت مانند Adobe Audition يا Cool edit كمك بگيريد.
نكته فني و ظريف ديگر آن است كه براي از بين بردن افكت صوتي مزاحم كه به‌صورت صداهاي "كليك" ممكن است شنيده شوند، بايد ابتدا و انتهاي نمونه‌هاي آلوفن‌ها را شيبدار يا به اصطلاح فني‌تر fade in و fade out كنيد. بعد از اين‌كار لازم است كه تمام نمونه‌ها را نرماليزه كنيد تا صداي يكنواخت و طبيعي‌تري به‌دست آوريد. (نرمال كردن صدا به اين معني است كه دامنه يا شدت صدا از حد مشخصي كه آستانه اشباع ناميده مي‌شود، بيشتر نشود. بدين ترتيب بلند‌ترين بخش هر يك از نمونه‌ها با يكديگر برابر خواهند شد.)


كد 3

makePhrase = function () {
if (soundCount < soundMax){
soundCount++;
speech.attachSound(aPhones[soundCount]);
speech.start();
} else {
delete speech.onSoundComplete;
}
};
function say (phrase) {
var i = j= 0;
aPhones = new Array();
for (i = 0; i < phrase.length; i++) {
if (phrase.charAt(i) != "|") {
aPhones[j] += phrase.charAt(i);
if (phrase.charAt(i) == " ") {
aphones[j] = "space";
}
}else {
j++;
}
}
speech.attachSound(aPhones[0]);
speech.start();
speech.onSoundComplete = makePhrase;
soundCount = 0;
soundMax = j-1;
}
function SoundInit () {
speech = new Sound(this);
}
soundInit();
say("h|e|ll|oo| | | | | |h|ow| |ar| |y|ouu| | | | |tt|u|d|ay|");
stop();





بالاخره در صورتي‌كه قصد استفاده از اين پروژه را در اينترنت داشته باشيد، مناسب‌تر خواهد بود كه نمونه‌هاي آلوفن‌ها را بهينه يا Optimize كنيد تا از حجم آن‌ها كاسته شود.

پس از مراحل فوق، كتابخانه‌اي در فلش خواهيد داشت كه در آن تمام نمونه‌ها با نزديك‌ترين شكل نوشتاري خود نام‌گذاري شده‌اند.

سينتي‌سايزر‌هاي قديمي قابليت تبديل متون معمولي به گفتار را نداشتند. در نتيجه براي آن‌كه واژه خاصي را تلفظ كنند، كاربر ناگزير به نوشتن متن ديگري بود كه شباهت كمي به نوشته واقعي داشت. به عنوان مثال، براي تلفظ واژه Knowledge از عبارتي شبيه nnolej استفاده مي‌شد. (براي تلفظ واژه‌هاي فارسي اين مشكل حاد‌تر هم مي‌شود.) به اين ترتيب يك سينتي‌سايزر، به انواع مختلفي تقسيم‌بندي مي‌شود. سينتي‌سايزر‌هايي كه قابليت تبديل متن به گفتار را داشته باشند، سينتي‌سايزر متني ناميده مي‌شوند و سينتي‌سايزر از نوعي كه تشريح شد و قرار است ما در اينجا آنرا با فلش بسازيم، يك سينتي‌سايزر فونتيك نام دارد.
(اگر جوياي نام هستيد و يا به ماجراجويي علاقمنديد، مي‌توانيد در اين زمينه‌ها، خصوصاً در مورد زبان فارسي كار كنيد. مسلماً جامعه ما به‌شدت به چنين فعاليت‌هايي نياز دارد.)

در قطعه كد شماره 3، سورس كدي را ملاحظه مي‌كنيد كه حجم زيادي از آن براي پردازش رشته‌هاي متني اختصاص يافته است تا فلش بتواند نوشتار فونتيك (كه از همان نامگذاري‌هاي آلوفن‌ها به‌دست آمده است) را تشخيص داده و بر اساس آن قادر باشد آلوفن‌ها را يكي پس از ديگري پخش كند.

در اين قطعه كد از علامت ‌ براي تفكيك آلوفن‌ها استفاده شده است. البته شما مي‌توانيد از روش ديگري هم براي نام‌گذاري و در نتيجه پردازش رشته‌هاي متني استفاده كنيد. به اين ترتيب كه به‌جاي نام‌گذاري آلوفن‌ها در كتابخانه فلش به‌صورت مثلا ًaa و uu يا oo و غيره از اسامي ساده مانند o1 - 02 كمك بگيريد.

در روش به‌كار گرفته شده در اين‌جا براي آن‌كه واژه Hello را بشنويد، بايد تابع say را به‌صورت زير فراخواني كنيد:
Say("h|e|ll|oo")

اين تابع در سورس كد شماره 3 به‌صورت زير عمل مي‌كند:

ابتدا آرايه جديد ساخته مي‌شود، مثلاً:

Aphone [0] ="h"
Aphone [0] ="e"
Aphone [0] ="ll"
Aphone [0] ="oo"

در مرحله بعد، نخستين صدا يعني h به Instance صدا متصل شده و توسط رويداد onSoundComplete پس از تشخيص پايان آن، صداهاي بعدي به همين ترتيب پخش مي‌شوند. اين عمل توسط تابع ()makePhrase انجام مي‌شود كه صداي بعدي را در صف آلوفن دريافت كرده و آن‌را به Intance صدا متصل مي‌سازد.

يك نكته فني براي كار حرفه‌اي‌تر
در سورس كد فوق، تنها از يك Instance صدا استفاده شده است. نرم‌افزار فلش از چهار كانال صوتي استريو پشتيباني مي‌كند. شما مي‌توانيد براي كاربردهاي حرفه‌اي‌تر به‌جاي استفاده از يك Instance صدا از تعداد بيشتري از آنها استفاده كنيد و هر يك از آن‌ها را به يك ()viaSound.attachSound نسبت دهيد. به اين ترتيب شما خواهيد توانست از تمام قدرت هشت كانال صوتي(Mono) فلش بهره گيريد.

اگرچه در ابتداي اين نوشته به كاربردهايي اشاره شد كه به‌طور معمول به كار يك كاربر معمولي نمي‌آيند، اما كاربردهاي جالب ديگري نيز مي‌توانيد براي اين پروژه بيابيد. به عنوان مثال شايد بتوانيد نرم‌افزاري طراحي كنيد كه قرارهاي ملاقات يا برنامه روزانه شما را به‌صورت صوتي به شما يادآوري‌كند.

منبع:ماهنامه شبكه

Elfin-D
22-12-2005, 15:12
سلام
بابك جان تبريك 2 تا ميگم بهت ميگم.اولي به خاطر اموزش خوبت و دومي به خاطر كاربر فعال شدن.اميدوارم كه هميشه موفق باشي!

Babak_King
22-12-2005, 15:29
سلام الفين جان
مممنون از تبريكت
خيلي چاكريم ها
موفق باشي

STAYWITHME
23-12-2005, 15:11
بابک جان این چیزی که نوشتی بیشتر شبیه به یه معرفی و آشنایی کلی داره
کامل نخوندم ولی اولاش که چرت و پرت بود
در ضمن این آموزش برای فلش 6 هست در صورتی که ما در حال حاضر از فلش 8 استفاده می کنیم

در مورد کد هات هم باید بگم که به دلیل ریز بودن خوندنشون دشوار بور و معمولا کد رو به صورت تایپ شده میدن نه عکس .

Babak_King
23-12-2005, 17:44
بابک جان این چیزی که نوشتی بیشتر شبیه به یه معرفی و آشنایی کلی داره
کامل نخوندم ولی اولاش که چرت و پرت بود
در ضمن این آموزش برای فلش 6 هست در صورتی که ما در حال حاضر از فلش 8 استفاده می کنیم

در مورد کد هات هم باید بگم که به دلیل ریز بودن خوندنشون دشوار بور و معمولا کد رو به صورت تایپ شده میدن نه عکس .


سلام staywithme جان خوبي عزيز
اولا اين قابليت تو همه ورژنايه فلاش كارايي داره
دوما منظورتون از چرت و پرت چيه
سوما داداش دو تا كد داخل عكسه بقيش كه خواناست
:blush: ;) :) ;)

Babak_King
23-12-2005, 17:45
تازه همون دو تاشم خواناست

STAYWITHME
23-12-2005, 18:35
بابک جان می بخشید ها ولی اون د ها خیلی ریز هستند . البته اینو با توجه به این می گم که کلا فونت های سایت ریز هست و این عکس هم که از اون ریز تر . دوم اینکه کد ها رو نباید به صورت عکس می زاشتی چون روالش اینه که به صورت متن باشه ، تا بشه کپی شون کرد . و سوم اینکه عنوان تاپی طوری هست که آدم فکر می کنه این مطلب آموزش هست ولی در واقع امر این مطلا برسی این قابلیت از فلش هست .

Babak_King
23-12-2005, 19:24
staywithme جان فونتاشو بزرگ كردم
از بابت عكسا به بزرگي خودت ببخش
اگه وقت كنم به صورت كامل يه مقاله آموزشي بران ميزارم
موفق باشي

Elfin-D
28-12-2005, 22:00
سلام
اقا منظور ايشون عكسها بود.چرا فونت مقاله رو بزرگ كردي؟

STAYWITHME
29-12-2005, 12:59
مرسی .

فکر کنم منظورت از بران همون برات هست ؟؟

اگه دوست داشتی درستش کن

Babak_King
29-12-2005, 13:29
مرسی .

فکر کنم منظورت از بران همون برات هست ؟؟

اگه دوست داشتی درستش کن


ببينم عزيز جز ايراد گرفتن جنابعالي كار ديگه ايم بلدي

Elfin-D
29-12-2005, 13:33
سلام
دوستان دعوا بدهست.همينجا تمومش كنيد!!

STAYWITHME
31-12-2005, 12:18
بله من کار های دیگه ای هم بلدم ....... :biggrin: :)