منبع اصلی نوشتار زیر در این لینک قرار دارد

لگو بازی با گنو/لینوکس: تلفظ لغات در NOKIA N900.

سلام

زمانی که N900 رو خریدم توی لیست برنامه های که روش نصب کردم دیکشنری هم بود. معروف ترین دیکشنری ها که من دیدم (شایدم دیکشنری دیگه ای وجود نداشته) Mstardict و Qstardict بودن. اوّلا از Qstardict استفاده می کردم ولی چون نمی تونست دیکشنری Oxford Talking رو نشون بده تصمیم گرفتم Mstardict رو نصب کنم. این یکی نسبت به قبلی بهتره ولی هنوز ناقصه. نقصشم این هست که نمی تونه کلمه رو به شکل انسانی تلفظ کنه. من دوست داشتم تلفظ کلمه ای رو که دنبالش می گردم رو به شکل انسانی بشنوم. این عادت بد رو شاید از زمانی که روی سیستم xstardict نصب کرده بودم دارم. xstardict (اگر اسمش درست یادم باشه) یه دیکشنری آزاد بود که تلفظ های انسانی رو به شکل یک بسته توی سایتش گذاشته بود و تنها کاری که باید می کردیم این بود که بعد از دانلود اون رو توی به مسیر خاص اکسترکت می کردیم تا برنامه بتونه خودش از اونها استفاده کنه. امّا متأسفانه بعد ها این پروژه از روی sourceforge پاک شد ولی خوشبختانه من هنوز فایلهای تلفظ برنامه رو روی کامپیوتر داشتم. پس تصمیم گرفتم طی یه حرکت گیک وارانه یه script برای خودم دست و پا کنم تا بتونه کلمه رو از ورودی بگیره و در صورتی که براش تلفظی وجود داشت اون رو پخش کنه.

قدم اوّل این بود که یه سری یه پوشه تلفظ ها بندازم و ببینم ساختارش به چه شکله. نتیجه خوشحال کننده بود:

\"مسیر

نتیجه اوّل این هست که فایل تلفظ هر کلمه همنام خود کلمه هست و کلماتی که با حرف مشابه شروع می شن هم درون یه پوشه جدا گانه قرار دارن مثلاً‌ کلمات abacus و abandon درون یه پوشه به اسم a قرار دارن و کلماتی مثل car و carwash درون یه پوشه یه اسم c. پس برای اینکه من بدونم برای کلمه ی مورد نظر من تلفظ هست کافی پوشه ای که به اسم حرف اوّل کلمه هست رو بگردم.  و نتیجه دوّم این هست که همه فایلهای صوتی در قالب wav هستن.

قدم دوّم این هست که با استفاده از نتایج بالا بتونم فایل تلفظ اون رو در صورت وجود پیدا کنم. برای این کار بعد از گرفتن کلمه از ورودی باید بتونم حرف اوّل اون رو برای رفتن به داخل پوشه ای که فایل تلفظ در صورت وجود داخل اون هست پیدا کنم. برای این کار من از دستور cut و فیلتر کردن اوّلین کاراکتر استفاده می کنم:

echo word | cut -c1

فقط کافی هست خروجی این دستور رو داخل یه متغیر ذخیره کنم.

DIR=`echo $1 | cut -c1`

و به جای کلمه word وروری رو بزارم یعنی 1$.  با این حساب  آدرس

WyabdcRealPeopleTTS/$DIR/$1.wav

به فایل تلفظ کلمه ی مورد نظر من اشاره می کنه. پس قدم سوم اینه که اون رو با یه پخش کننده ی فایلهای صوتی پخشش کنم. من aplay رو انتخاب می کنم. و دستورش رو یه شکل زیر می نویسم:

aplay WyabdcRealPeopleTTS/$DIR/$1.wav 2> /dev/null

علت اینکه خروجی اون رو به فایل null فرستادم این هست که مطالبی که ارزشی برام ندارن رو توی ترمینال چاپ نکنه.

خب تا اینجا هدف ما برآورده شد ولی یه خورده بهتر ترش می کنم. مثلاً اگر تلفظی وجود نداشت می خوام این مسئله رو با من در میون بزاره. برای این کار از دستور if استفاده می کنم تا به طور مستقیم وجود فایل رو بررسی کنه اگر وجود داشت پخش بشه و اگر وجود نداشت یه متن ساده که حاکی از وجود نداشتن فایل تلفظ برای کلمه ی مورد نظر هست رو نشون بده. نتیجه می شه چیزی شبیه به این:

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 بزارم تا به همون تعداد اون رو پخش کنه. در نهایت اسکریپت می شه چیزی شبیه به این:

#!/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/ گذاشتم و دسترسی لازم رو بهش دادم تا هر بار که لازمش دارم چیزی شبیه به دستور زیر رو بزنم:

say 3 word

در این صورت خروجی علاوه بر تکرار ۳باره تلفظ کلمه ی word به شکل زیر خواهد بود:

ASLAN:$ say 3 word
1 2 3 .
ASLAN:$

فایلهای تلفظ رو آپلود کردم روی 4Shared چون هاست خودم فضای چندانی نداره. می تویند از این لینک دریافت استفاده کنید.



برچسب ها : , , , , , , , , , , , , , ,

به سیاره لینوکس امتیاز دهید

به اين صفحه امتياز دهيد