четверг, 22 ноября 2012 г.

Синтез голоса в Android-приложении

Когда мы делаем наши Android-приложения, часто приходится сообщать что-то пользователю. Мы открываем ему AlertDialog, показываем Toast, бросаем сообщения в панель уведомления, сигналим, вибрируем... Вершина этой пирамиды уведомлений - просто сказать то что хочешь от клиента "человеческим голосом".
Голос, само собой, будет не совсем человеческим. Мы его синтезируем. То есть, Google синтезирует, а мы его об этом вежливо попросим.
Конечно, это не единственный спрособ: есть десяток голосовых движков, которые замечательно обходятся без Гугла, но подключать их в своё приложение - отдельная непростая (а порой и недешёвая) задача. Да, для них не нужен Интернет, но если ваше приложение и так его требует, то зачем себя исскуственно ограничивать? ;)

Для синтеза речи будем использовать неофициальное Google Text-To-Speech API. Оно замечательно работает для их браузера, поработает и для нас. Представимся только правильным User-Agent :)
Как и все API "корпорации добра", это API прекрасно в своей простоте:
http://translate.google.com/translate_tts?tl=en&q=text
И всё...

В ответе приедет mp3-кодированный звук с произнесённым приятным голосом текстом из параметра q на языке tl.

Вот простой класс, который мы можем использовать как "плейер" любой строки:

import android.media.MediaPlayer;
import android.os.Environment;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URLEncoder;
 
public class TextPlayer extends Thread {
 
    private String text;
 
    public TextPlayer(String text) {
        this.text = text;
    }
 
    @Override
    public void run() {
        try {
            HttpClient httpclient = new DefaultHttpClient();
            HttpGet get = new HttpGet("http://translate.google.com/translate_tts?tl=ru&q="+ URLEncoder.encode(text, "UTF-8"));
            get.setHeader(new BasicHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11"));
            HttpResponse response = httpclient.execute(get);
            long length = response.getEntity().getContentLength();
            InputStream content = response.getEntity().getContent();
            String tmpf = Environment.getExternalStorageDirectory()+"/speech.mp3";
            File tmpMp3 = new File(tmpf);
            FileOutputStream fos = new FileOutputStream(tmpMp3);
            long readed = 0;
            byte[] buf = new byte[512];
            while ((readed+=content.read(buf))<length) {
                fos.write(buf);
            }
            fos.flush();
            fos.close();
            MediaPlayer player = new MediaPlayer();
            player.reset();
            player.setDataSource(tmpf);
            player.prepare();
            player.start();
            while (player.isPlaying()) {}
            tmpMp3.delete();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

В любом месте нашего проекта мы теперь делаем
new TextPlayer("добрый вечер").start();
и Google с нами вежливо поздоровается :)

1 комментарий:

  1. Подскажите пожалуйста как подключить библиотеки:
    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicHeader;

    ОтветитьУдалить