مقدمه تبدیل متن به گفتار در اندروید

موتور تبدیل نوشتار به گفتار اندروید SDK ، قابلیتی است که گرچه استفاده از آن بسیار ساده و سرراست است، اما تاکنون آنچنان که باید و شاید به‌کار برده نشده است. توجه داشته باشید که با وجود مسائل و انتخاب‌های متعددی که در زمان به‌کارگیری موتور تبدیل text to speech وجود دارد، اما کل این فرایند چندان پیچیده نیست. در این مقاله با چگونگی استفاده از موتور تبدیل نوشتار به گفتار android، در یک Activity مشخص آشنا خواهید شد. شما می‌توانید این عملکرد را در هر اپلیکیشن دیگری به‌کار ببرید.

نکته
دوره پیشنهادی: بسته جامع آموزش اندروید

مراحل تبدیل متن به گفتار در اندروید

گام اول:آغاز یا باز کردن یک پروژه اندروید

در اولین مرحله از تبدیل text to speech، باید یک پروژه اندرویدی جدید را ایجاد کرده یا اپلیکیشن مورد نظر را در محیط یکپارچه توسعه نرم‌افزار باز کنید. خوشبختانه، کد گفته شده در این آموزش، قابل اعمال به هر کلاس Activity است. همچنین شما می‌توانید واسط کاربری خود را به‌جای المان‌های گفته شده در این آموزش استفاده کنید.

گام دوم: ایجاد کردن المان‌های واسط کاربری

برای این که کاربر قادر باشد متن خود را وارد کرده و پخش گفتار را با فشار یک دکمه آغاز کند، شما باید برخی از المان‌ های واسط کاربری را به برنامه خود اضافه کنید. اگر یک پروژه جدید ایجاد کرده باشید، نام فایل لی‌اوت XML فعالیت، “main.xml” خواهد بود. در این صورت، قطعه کد زیر را به آن بیفزایید:

<TextView android:id="@+id/intro"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Enter some text:"
/>
<EditText android:id="@+id/enter"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>
<Button android:id="@+id/speak"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Speak"
/>

اگر این کد به‌درستی وارد شود، سه المان واسط کاربری، شامل یک برچسب حاوی برخی متون آموزشی، یک فایل متنی قابل ویرایش و یک دکمه اضافه می‌شوند. شما می‌توانید فایل‌های لی‌اوت XML را در دایرکتوری “res/layout” درون بسته اپلیکیشن خود پیدا کنید. برای تبدیل نوشتار به گفتار اندروید، کاربر متن را درون فیلد وارد کرده و با فشار دادن دکمه، می‌تواند صحبت کردن آن را بشنود. برای متناسب کردن طراحی اپلیکیشن خود، امکان تغییر المان‌های جدید برای شما وجود دارد. همچنین، در صورت به‌کاربردن یک پروژه موجود، شما می‌توانید از المان‌های واسط کاربری استفاده کنید.

گام سوم: گوش کردن به رخدادهای کاربر

اگر مایل به پیاده‌سازی TTS در یک Activity باشید، باید فایل جاوای آن را باز کنید. اگر پیشتر یک اپلیکیشن جدید را ایجاد کرده اید، فایل کلاس اصلی را باز کنید. به‌عنوان مثال، در Eclipse، فعالیت شما متد “onCreate” را به‌صورت اتوماتیک درون خود داشته و “Activity” را به‌عنوان بخشی از اعلان خود گسترش می‌دهد. با اضافه کردن جملات ورودی زیر، برنامه شما می‌تواند برای شنیدن کلیک‌های دکمه آماده باشد:

import android.view.View.OnClickListener;
import android.widget.Button;
import android.view.View;

با استفاده از کدی که مشابه نمونه زیر باشد، می‌توانید اعلان کلاس را برای پیاده‌سازی واسط کاربری “OnClickListener” تغییر دهید.

public class SpeakingAndroid extends Activity implements OnClickListener

برای متناسب کردن جزئیات اپلیکیشن خود، شما باید نام کلاس را عوض کنید. اگر IDE هشدارهایی را مبنی بر عدم پیاده‌سازی صحیح “OnClickListener” توسط کلاس نمایش داد، در این مرحله از آنها عبور کنید. قطعه کد زیر را به متد “onCreate” بیفزایید:

Button speakButton = (Button)findViewById(R.id.speak);
speakButton.setOnClickListener(this);

اگر با استفاده از “speak” به‌عنوان ID در فایل لی‌اوت XML، دکمه را به‌درستی اضافه نکرده اید، این قطعه کد را برای منعکس کردن ارزش صحیح ID تغییر دهید. این کار، کلاس Activity را برای کنترل کلیک‌های دکمه، تنظیم می‌کند. طرح متد زیر را به کلاس خود بیفزایید:

Button speakButton = (Button)findViewById(R.id.speak);
speakButton.setOnClickListener(this);

گام چهارم: متن وارد شده را دریافت کنید

پس از کلیک کردن بر روی دکمه، اپلیکیشن شما باید تمام متون وارد شده را برای رساندن آنها به متد TTS، دریافت کند. برای این که کد شما بتواند به فیلد متنی قابل ویرایش ارجاع دهد، جملات ورودی زیر را به ابتدای اعلان کلاس اضافه کنی قطعه کد زیر را در درون متد “onClick” وارد کنید:

import android.widget.EditText;

قطعه کد زیر را در درون متد “onClick” وارد کنید:

EditText enteredText = (EditText)findViewById(R.id.enter);
String words = enteredText.getText().toString();

برای دست‌یابی به فیلد متنی، این کد از مقدار ID آن استفاده می‌کند. اگر شما در لی‌اوت XML خود از مقدار متفاوتی استفاده می‌کنید، می‌بایست این مقدار را در این مرحله تغییر دهید. در مرحله بعدی تبدیل نوشتار به گفتار اندروید، کد مورد نظر، متن را از فیلد دریافت کرده و آن را به عنوان یک متغیر رشته ذخیره می‌کند. اگر کاربر هیچ متنی وارد نکند، متغیر رشته خالی خواهد بود. برای چک کردن خالی بودن یا نبودن رشته یا صفر بودن یا نبودن طول آن، شما می‌توانید یک تست شرطی را بسته به منطق درون اپلیکیشن خود، اضافه کنید، اما این کار به‌طور کلی ضروری نیست.

گام پنجم: ایجاد یک متد گفتاری

توصیه می‌شود که برای سازمان‌دهی به کلاس‌های android، برای فرایندهایی که بیش از یک بار مایل به استفاده از آنها هستید، متدهایی اختصاصی را ایجاد نمایید. قطعه کد زیر را به Activity خود اضافه کنید:

private void speakWords(String speech) {
//implement TTS here
}

پردازش TTS شما از این نقطه آغاز می‌شود. با صدا زدن این متد تازه در متد شنونده “onClick”، متغیر رشته‌ای که توسط کد شما از فیلد متنی کپی شده است، انتقال خواهد یافت:

speakWords(words);

با استفاده کردن از یک متد برای فرایند TTS، قطعه کد شما می‌تواند در هر موقعیت لازم، آن را بازخوانی نماید.

گام ششم: پیاده‌سازی TTS درون کلاس

با اعمال برخی تغییرات به اعلان کلاس، می‌توانید از امکان TTS استفاده کنید. جملات ورودی زیر را برای کلاس‌های TTS در قسمت بالایی فایل خود اضافه نمایید:

import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;

از آنجا که نیاز است یک واسط کاربری دیگر را نیز پیاده‌سازی کنید، برای افزودن “OnInitListener” به‌صورت زیر، طرح اعلان کلاس را تغییر دهید:

public class SpeakingAndroid extends Activity implements OnClickListener, OnInitListener

. در این مرحله، مجددا هشداری را از سمت IDE دریافت خواهید کرد که به شما می‌گوید که هنوز واسط کاربری را پیاده‌سازی نکرده اید، اما نگران نباشید. شما به‌زودی این کار را انجام خواهید داد. همچنین به یاد داشته باشید که در این مرحله از نام کلاس خود استفاده کنید.

گام هفتم: چک کردن داده‌های TTS

پیش از صدا زدن متدها، برنامه باید مطمئن شود که کاربر تمامی داده‌های لازم برای عملکرد TTS را دارد. برای این منظور، متغیر نمونه زیر را در قسمت بالایی اعلان کلاس Activity و پیش از متد “onCreate”، آورده و اعلان کنید:

private int MY_DATA_CHECK_CODE = 0;

جمله ورودی زیر را به قسمت بالایی کلاس اضافه کنید:

import android.content.Intent;

خطوط زیر را به متد “onCreate” بیفزایید:

Intent checkTTSIntent = new Intent();
checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkTTSIntent, MY_DATA_CHECK_CODE);

این کد به منظور چک کردن داده‌های کاربر، مفاد جدیدی را ایجاد می‌کند. زمانی که فرایند بررسی به پایان رسید، این کد، متد “onActivityResult” را صدا خواهد زد.

گام هشتم: ایجاد یک نمونه TTS

یک متغیر نمونه را برای شیء TTS خود در قسمت بالایی اعلان کلاس و پیش از متد “onCreate” اعلام کنید:

private TextToSpeech myTTS;

به‌صورت زیر، “onActivityResult” را به کلاس خود اضافه کنید:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == MY_DATA_CHECK_CODE) {
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {      
            myTTS = new TextToSpeech(this, this);
        }
        else {
            Intent installTTSIntent = new Intent();
            installTTSIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installTTSIntent);
        }
        }
}

زمانی که کار بررسی به پایان رسید، برنامه این متد را صدا زده و متغیر “MY_DATA_CHECK_CODE” را به آن انتقال می‌دهد. این متغیر نشانگر این است که آیا کاربر داده TTS را نصب کرده است یا خیر. اگر داده وارد شده بود، کد به پیش می‌رود و یک نمونه از کلاس TTS را می‌سازد. در غیر این صورت، برنامه از کاربر می‌خواهد که آن را نصب کند

گام نهم: آماده‌سازی متد onInit

در این مرحله از تبدیل text to speech android، اعلان کلاس در حال پیاده‌سازی “OnInitListener” است، پس شما باید یک متد “onInit” را فراهم کنید. در این متد، امکان انجام تمامی بررسی‌های نهایی و انتخاب تنظیماتی برای نمونه TTS (مانند گزینه‌های زبان و محل) فراهم است. جملات ورودی زیر را به بالای کلاس خود اضافه کنید:

import java.util.Locale;

متد “onInit” را به کلاس خود بیفزایید:

public void onInit(int initStatus) {
    if (initStatus == TextToSpeech.SUCCESS) {
        myTTS.setLanguage(Locale.US);
    }
}

این قطعه کد، بررسی می‌کند که آیا منابع TTS به‌درستی معرفی شده اند یا خیر. سپس گزینه مکانی US English را برای بخش گفتار انتخاب می‌کند. اما در صورتی که TTS به‌صورت موفقیت آمیز معرفی نشد، شما می‌توانید با اضافه کردن بلوک زیر که بعد از “if” قرار می‌گیرد، یک پیام خطا را در خروجی نشان دهید.

else if (initStatus == TextToSpeech.ERROR) {
    Toast.makeText(this, "Sorry! Text To Speech failed...", Toast.LENGTH_LONG).show();
}

در صورت استفاده از این کد، باید کلاس Toast را نیز وارد کنید. برای این کار، جمله زیر را به بالای فایل خود اضافه نمایید:

import android.widget.Toast;

همان‌طور که در ادامه نشان داده می‌شود، اپلیکیشن می‌تواند بررسی‌هایی را بر روی دستگاه کاربر انجام دهد، به عنوان مثال، چک کند که چه زبان‌هایی روی این دستگاه وجود دارند:

if(myTTS.isLanguageAvailable(Locale.US)==TextToSpeech.LANG_AVAILABLE) myTTS.setLanguage(Locale.US);

گام دهم: صحبت کردن

در این بخش از تبدیل نوشتار به گفتار در اندروید، برنامه شما آماده صحبت کردن است. کد زیر را به درون متد “speakWords” وارد کنید:

myTTS.speak(speech, TextToSpeech.QUEUE_FLUSH, null);

در این مرحله، اپلیکیشن شما برای کنترل گفتار، گزینه‌های زیادی دارد. کدی که ما استفاده کرده ایم، به برنامه می‌آموزد که رشته متنی را بلافاصله بخواند. اما اگر از قطعه کد زیر استفاده کنید، به برنامه آموزش خواهید داد که تا زمان اتمام عملیات گفتار کنونی، صبر کند:

myTTS.speak(speech, TextToSpeech.QUEUE_ADD, null);

زمانی که کار کلاس با TTS به اتمام رسید، می‌توانید با استفاده از قطعه کد زیر، به‌صورت اختیاری آن را خاموش کنید. اگر می‌خواهید که برنامه بیش از یک بار صحبت کند، از این خط چشم‌پوشی نمایید.

myTTS.shutdown();

نتیجه گیری تبدیل متن به گفتار در اندروید

در انتهای مقاله، یک اعلان کلاس کامل را به شما ارائه می‌دهیم تا مشاهده کنید که تمامی المان‌های گفته شده چگونه در کنار هم قرار می‌گیرند:

import android.app.Activity;
import android.os.Bundle;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.view.View;
import android.widget.EditText;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.content.Intent;
import java.util.Locale;
import android.widget.Toast;
 
public class SpeakingAndroid extends Activity implements OnClickListener, OnInitListener {
     
        //TTS object
    private TextToSpeech myTTS;
        //status check code
    private int MY_DATA_CHECK_CODE = 0;
     
        //create the Activity
    public void onCreate(Bundle savedInstanceState) {
     
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
             
                //get a reference to the button element listed in the XML layout
            Button speakButton = (Button)findViewById(R.id.speak);
                //listen for clicks
            speakButton.setOnClickListener(this);
 
            //check for TTS data
            Intent checkTTSIntent = new Intent();
            checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
            startActivityForResult(checkTTSIntent, MY_DATA_CHECK_CODE);
    }
     
        //respond to button clicks
    public void onClick(View v) {
 
            //get the text entered
            EditText enteredText = (EditText)findViewById(R.id.enter);
            String words = enteredText.getText().toString();
            speakWords(words);
    }
     
        //speak the user text
    private void speakWords(String speech) {
 
            //speak straight away
            myTTS.speak(speech, TextToSpeech.QUEUE_FLUSH, null);
    }
     
        //act on result of TTS data check
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     
        if (requestCode == MY_DATA_CHECK_CODE) {
            if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
                //the user has the necessary data - create the TTS
            myTTS = new TextToSpeech(this, this);
            }
            else {
                    //no data - install it now
                Intent installTTSIntent = new Intent();
                installTTSIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                startActivity(installTTSIntent);
            }
        }
    }
 
        //setup TTS
    public void onInit(int initStatus) {
     
            //check for successful instantiation
        if (initStatus == TextToSpeech.SUCCESS) {
            if(myTTS.isLanguageAvailable(Locale.US)==TextToSpeech.LANG_AVAILABLE)
                myTTS.setLanguage(Locale.US);
        }
        else if (initStatus == TextToSpeech.ERROR) {
            Toast.makeText(this, "Sorry! Text To Speech failed...", Toast.LENGTH_LONG).show();
        }
    }
}

در انتها فراموش نکنید که حتما از نام کلاس خود استفاده کرده و پکیج اپلیکیشن خود را در قسمت بالایی فایل نمایش دهید. از آنجا که IDE برخی از این جملات ورودی را به‌صورت اتوماتیک به Eclipse وارد می‌کند، نیازی به اضافه کردن آنها به‌شکل دستی نیست. با اجرای برنامه خود در شبیه‌ساز اندروید، می‌توانید نحوه کار آن را گوش کنید.
با خواندن این مقاله، یک دید کلی از نحوه پیاده‌سازی تبدیل text to speech در برنامه‌های اندروید خود آشنا شدید. اگر مایل به بررسی گزینه‌های بیشتری بودید، می‌توانید از منابع TTS استفاده کنید. برای مثال، با صدا زدن متد “speak” شیء TextToSpeech، می‌توانید یک شیء HashMap را برای نشان دادن جزئیات گزینه‌های پیچیده‌تر، به‌کار ببرید.