Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
RenatSayf
186 / 0 / 2
Регистрация: 15.03.2015
Сообщений: 9
#1

TextToSpeech долгая инициализация

16.07.2016, 21:23. Просмотров 217. Ответов 0
Метки нет (Все метки)

Привет всем!
Помогите решить проблему долгой инициализации TextToSpeech.
Ниже представлен код примера с использованием TextToSpeech на разных языках(En & Ru). Если поочередно кликать по кнопкам озвучки то задержка синтеза речи составляет 5 - 10 сек (я специально там таймер внедрил). Вопрос - это такая особенность андройдовского TextToSpeech-движка или я что-то неправильно делаю. Тестирую на реальном дивайсе ZTE Blade AF3, версия Android: KitKat 4.4.2. Может кто проверит на LolliPop или Marshmallow.
Честно говоря, разочарован googleвскими технологиями: на WindowsPhone8.1 аналогичный пример работает без всяких задержек.
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.renat.example_ttspeech.MainActivity"
    >
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_weight="1"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="English"
        android:id="@+id/txt_view_en"
        android:layout_below="@+id/linearLayout"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="90dp"/>
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_weight="1"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="Russian"
        android:id="@+id/txt_view_ru"
        android:layout_alignBottom="@+id/btn_ru"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"/>
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:id="@+id/linearLayout">
 
 
    </LinearLayout>
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Озвучить"
        android:layout_weight="1"
        android:id="@+id/btn_ru"
        android:layout_marginBottom="154dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"/>
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Audio"
        android:layout_weight="1"
        android:id="@+id/btn_en"
        android:layout_alignBottom="@+id/txt_view_en"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"/>
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Next"
        android:id="@+id/btn_next"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="23dp"/>
 
    <Chronometer
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/chronometer"
        android:layout_above="@+id/btn_ru"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="50dp"
        android:textSize="40dp"/>
 
</RelativeLayout>
,

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
package com.example.renat.example_ttspeech;
 
import android.os.Build;
import android.os.SystemClock;
import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.TextView;
import android.widget.Toast;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
 
public class MainActivity extends AppCompatActivity
{
    private TextView textViewEn;
    private TextView textViewRu;
    private Button buttonEn;
    private Button buttonRu;
    private Button buttonNext;
    private Chronometer chronometer;
    private TextToSpeech speech;
    private HashMap<String, String> map = new HashMap<String, String>();
    private ArrayList<Words> wordses;
    private Locale localeEn = Locale.US;
    private Locale localeRu = Locale.getDefault();
    private String logTag = "TTS";
    private int count = 0;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        initViews();
 
        speech = new TextToSpeech(this, new TextToSpeech.OnInitListener()
        {
            @Override
            public void onInit(int status)
            {
                map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "text");
                if (status == TextToSpeech.SUCCESS)
                {
                    int resultRu = speech.isLanguageAvailable(localeRu);
                    if (resultRu == TextToSpeech.LANG_MISSING_DATA || resultRu == TextToSpeech.LANG_NOT_SUPPORTED)
                    {
                        Toast.makeText(MainActivity.this, localeRu.getDisplayName() + "язык не подерживается",Toast.LENGTH_SHORT).show();
                        buttonRu.setEnabled(false);
                    }
 
                    int resultEn = speech.isLanguageAvailable(localeEn);
                    if (resultEn == TextToSpeech.LANG_MISSING_DATA || resultEn == TextToSpeech.LANG_NOT_SUPPORTED)
                    {
                        Toast.makeText(MainActivity.this, localeEn.getDisplayName() + "язык не подерживается",Toast.LENGTH_SHORT).show();
                        buttonEn.setEnabled(false);
                    }
                }else
                {
                    Toast.makeText(MainActivity.this,"TextToSpeech - ошибка инициализации",Toast.LENGTH_SHORT).show();
                    buttonEn.setEnabled(false);
                    buttonRu.setEnabled(false);
                }
            }
        });
 
        speech.setOnUtteranceProgressListener(new UtteranceProgressListener()
        {
            @Override
            public void onStart(String s)
            {
                chronometer.stop();
            }
 
            @Override
            public void onDone(String s)
            {
 
            }
 
            @Override
            public void onError(String s)
            {
 
            }
        });
    }
 
    private void initViews()
    {
        wordses = new ArrayList<>();
        wordses.add(new Words("good", "хорошо"));
        wordses.add(new Words("red", "красный"));
        wordses.add(new Words("add", "добавить"));
        wordses.add(new Words("select", "выбрать"));
 
        textViewEn = (TextView) findViewById(R.id.txt_view_en);
        textViewRu = (TextView) findViewById(R.id.txt_view_ru);
        buttonEn = (Button) findViewById(R.id.btn_en);
        buttonRu = (Button) findViewById(R.id.btn_ru);
        buttonNext = (Button) findViewById(R.id.btn_next);
        chronometer = (Chronometer) findViewById(R.id.chronometer);
        buttonEn_OnClick();
        buttonRu_OnClick();
        buttonNext_OnClick();
 
        textViewEn.setText(wordses.get(0).getEnglish());
        textViewRu.setText(wordses.get(0).getRussian());
    }
 
    private void buttonNext_OnClick()
    {
        buttonNext.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                count++;
                if (count > wordses.size() - 1)
                {
                    count = 0;
                }
                textViewEn.setText(wordses.get(count).getEnglish());
                textViewRu.setText(wordses.get(count).getRussian());
            }
        });
    }
 
    private void buttonRu_OnClick()
    {
        buttonRu.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                chronometer.setBase(SystemClock.elapsedRealtime());
                chronometer.start();
                speech.setLanguage(localeRu);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
                {
                    speech.speak(textViewRu.getText().toString(), TextToSpeech.QUEUE_ADD, null, "xxx");
                }else
                {
                    speech.speak(textViewRu.getText().toString(),TextToSpeech.QUEUE_ADD, map);
                }
            }
        });
    }
 
    private void buttonEn_OnClick()
    {
        buttonEn.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                chronometer.setBase(SystemClock.elapsedRealtime());
                chronometer.start();
                speech.setLanguage(localeEn);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
                {
                    speech.speak(textViewEn.getText().toString(),TextToSpeech.QUEUE_ADD, null, "xxx");
                } else
                {
                    speech.speak(textViewEn.getText().toString(),TextToSpeech.QUEUE_ADD, map);
                }
            }
        });
    }
 
 
}
Полный код приложения на Bitbucket: https://bitbucket.org/RenatSayf/example_ttspeech
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2016, 21:23
Ответы с готовыми решениями:

Работа с TextToSpeech
Доброго времени суток! Есть тут кто мне поможет! TTS имеет свои локальные языки...

TextToSpeech, как вызвать speak несколько раз подряд?
С основами разобрался... &quot;говорить&quot; умею... Пользуюсь tts.speak(&quot;hello!&quot;,...

долгая загрузка
Пишу игрушку и проблема в том что контент грузиться 4-5 секунд работающий...

Инициализация переменной
Добрый день. Написал простую программу и не могу разобраться, глюк в программе...

Инициализация OpenGL ES
Вечер добрый, товарищи. Пытаюсь инициализировать область GLSurfaceView в части...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2016, 21:23

Динамическая инициализация ImageView
Привет, подскажите как реализовать инициализацию ImageView, когда их кол-во...

Инициализация базы данных
Есть главная активити + 3 фрагмента. Из фрагментов вызываются AsyncTask и...

Инициализация масива в массиве
Здравствуйте есть класс модели структуры public static class Exams{ ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru