لگو بازی با گنو/لینوکس: تلفظ لغات در NOKIA N900.
توسط: vahit
سلام
زمانی که N900 رو خریدم توی لیست برنامه های که روش نصب کردم دیکشنری هم بود. معروف ترین دیکشنری ها که من دیدم (شایدم دیکشنری دیگه ای وجود نداشته) Mstardict و Qstardict بودن. اوّلا از Qstardict استفاده می کردم ولی چون نمی تونست دیکشنری Oxford Talking رو نشون بده تصمیم گرفتم Mstardict رو نصب کنم. این یکی نسبت به قبلی بهتره ولی هنوز ناقصه. نقصشم این هست که نمی تونه کلمه رو به شکل انسانی تلفظ کنه. من دوست داشتم تلفظ کلمه ای رو که دنبالش می گردم رو به شکل انسانی بشنوم. این عادت بد رو شاید از زمانی که روی سیستم xstardict نصب کرده بودم دارم. xstardict (اگر اسمش درست یادم باشه) یه دیکشنری آزاد بود که تلفظ های انسانی رو به شکل یک بسته توی سایتش گذاشته بود و تنها کاری که باید می کردیم این بود که بعد از دانلود اون رو توی به مسیر خاص اکسترکت می کردیم تا برنامه بتونه خودش از اونها استفاده کنه. امّا متأسفانه بعد ها این پروژه از روی sourceforge پاک شد ولی خوشبختانه من هنوز فایلهای تلفظ برنامه رو روی کامپیوتر داشتم. پس تصمیم گرفتم طی یه حرکت گیک وارانه یه script برای خودم دست و پا کنم تا بتونه کلمه رو از ورودی بگیره و در صورتی که براش تلفظی وجود داشت اون رو پخش کنه.
قدم اوّل این بود که یه سری یه پوشه تلفظ ها بندازم و ببینم ساختارش به چه شکله. نتیجه خوشحال کننده بود:
نتیجه اوّل این هست که فایل تلفظ هر کلمه همنام خود کلمه هست و کلماتی که با حرف مشابه شروع می شن هم درون یه پوشه جدا گانه قرار دارن مثلاً کلمات abacus و abandon درون یه پوشه به اسم a قرار دارن و کلماتی مثل car و carwash درون یه پوشه یه اسم c. پس برای اینکه من بدونم برای کلمه ی مورد نظر من تلفظ هست کافی پوشه ای که به اسم حرف اوّل کلمه هست رو بگردم. و نتیجه دوّم این هست که همه فایلهای صوتی در قالب wav هستن.
قدم دوّم این هست که با استفاده از نتایج بالا بتونم فایل تلفظ اون رو در صورت وجود پیدا کنم. برای این کار بعد از گرفتن کلمه از ورودی باید بتونم حرف اوّل اون رو برای رفتن به داخل پوشه ای که فایل تلفظ در صورت وجود داخل اون هست پیدا کنم. برای این کار من از دستور cut و فیلتر کردن اوّلین کاراکتر استفاده می کنم:
1 |
echo word | cut -c1 |
فقط کافی هست خروجی این دستور رو داخل یه متغیر ذخیره کنم.
1 |
DIR=`echo $1 | cut -c1` |
و به جای کلمه word وروری رو بزارم یعنی 1$. با این حساب آدرس
1 |
WyabdcRealPeopleTTS/$DIR/$1.wav |
به فایل تلفظ کلمه ی مورد نظر من اشاره می کنه. پس قدم سوم اینه که اون رو با یه پخش کننده ی فایلهای صوتی پخشش کنم. من aplay رو انتخاب می کنم. و دستورش رو یه شکل زیر می نویسم:
1 |
aplay WyabdcRealPeopleTTS/$DIR/$1.wav 2> /dev/null |
علت اینکه خروجی اون رو به فایل null فرستادم این هست که مطالبی که ارزشی برام ندارن رو توی ترمینال چاپ نکنه.
خب تا اینجا هدف ما برآورده شد ولی یه خورده بهتر ترش می کنم. مثلاً اگر تلفظی وجود نداشت می خوام این مسئله رو با من در میون بزاره. برای این کار از دستور if استفاده می کنم تا به طور مستقیم وجود فایل رو بررسی کنه اگر وجود داشت پخش بشه و اگر وجود نداشت یه متن ساده که حاکی از وجود نداشتن فایل تلفظ برای کلمه ی مورد نظر هست رو نشون بده. نتیجه می شه چیزی شبیه به این:
1 2 3 4 |
if test -f WyabdcRealPeopleTTS/$DIR/$1.wav; then aplay WyabdcRealPeopleTTS/$DIR/$1.wav 2> /dev/null else printf "Do not exist any pronounciation file for \"%s\" word.\n" $1 |
یه نکته دیگه که من می خوام اضافش کنم این هست که وقتی کلمه ای رو می دم به تعدادی که من می خوام اون رو تکرار کنه. برای این کار کافی هست تعداد تکرار رو هم از ورودی بگیره و دستور پخش رو هم داخل یه حلقه ی for بزارم تا به همون تعداد اون رو پخش کنه. در نهایت اسکریپت می شه چیزی شبیه به این:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/bash declare DIR DIR=`echo $2 | cut -c1` if test -f /home/user/MyDocs/others/.WyabdcRealPeopleTTS/$DIR/$2.wav; then for ((count=1; count<=$1; count++)); do printf "%s$count " aplay /home/user/MyDocs/others/.WyabdcRealPeopleTTS/$DIR/$2.wav 2> /dev/null sleep 1 done printf ".\n" else printf "Do not exist any pronounciation file for \"%s\" word.\n" $2 fi exit 0 |
تغییرات دیگه ای که من توی کد دادم این هست که ورودی اوّل رو گرفتم تعداد تکرار مورد نظر و ورودی دوّم رو گرفتم کلمه ی مورد نظر. اینجوری برای درخواست های متعدد فقط کلمه رو جایگزین میکنم و لازم نیست کل دستور رو دوباره بنویسم.
من کد رو توی یه فایل bash به اسم say در مسیر /bin/ گذاشتم و دسترسی لازم رو بهش دادم تا هر بار که لازمش دارم چیزی شبیه به دستور زیر رو بزنم:
1 |
say 3 word |
در این صورت خروجی علاوه بر تکرار ۳باره تلفظ کلمه ی word به شکل زیر خواهد بود:
1 2 3 |
ASLAN:$ say 3 word 1 2 3 . ASLAN:$ |
فایلهای تلفظ رو آپلود کردم روی 4Shared چون هاست خودم فضای چندانی نداره. می تویند از این لینک دریافت استفاده کنید.
کار جالبی کردی ;-) اول خواستم بیام گیرت بدم که مرد حسابی من که فایلا رو ندارم چه به دردم میخوره، تهش دیدم اون رو هم گذاشتی :D دمت گرم! هنوز تستش نکردم، تست کنم ببینم اون چیزی که به نظرم اومد رو میشه روش گذاشت یا نه ;-)
نه خوب همه حسش به اون فایلهاست دیگه یا این اینترنت ذغالی ۱۰۴ مگ آپلود کردم:D
خیلی دوست دارم ببینم می خوای چی کار کنی؟ البته یه حدسی میزنم که اگه اون باشه کار جالبیه برو تو کارش که اگه دیر کنی میشه پست بعدیم :)))
ویرایش: البته همه تلفظ ها با یه صدا نیست ها! زنونه داره مردونه داره (خخخخ)
از تو چه پنهون از اونجایی که سواد بش اسکریپتنگم داغونه و هی میخواستم کارا رو سبک پایتون انجام بدم کلا به نتیجه نرسیدم، همون خودت انجام بده بینم چیه :D
[…] تقریباً یک ماه پیش بود که پست «لگو بازی با گنو/لینوکس: تلفظ لغات در NOKIA N900.» رو ارسال کردم و یاد گرفتیم که چطور این کار رو انجام […]
کی میشه تو این کلاس های آموزشی فقط ویندوز به بچه های مردم درس ندن
[…] لگو بازی با گنو/لینوکس: تلفظ لغات در NOKIA N900 […]
اگر بزنیم A چه اتفاقی می افته؟ :)
میگه تلفظ وجود نداره!
بهتره ال همه رو lower case کنی تا این مشکل پیش نیاد.
در اولین فرصت حتماً اصلاحش می کنم.
ممنون از نظر و وقتی که گذاشتین :)
[وحید: لطفاً آدرس سایت خودتون رو فقط در فیلد مخصوص بنویسید!]
جالب بود ممنون