Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
RenatSayf
186 / 0 / 2
Регистрация: 15.03.2015
Сообщений: 9
#1

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

16.07.2016, 21:23. Просмотров 115. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2016, 21:23     TextToSpeech долгая инициализация
Посмотрите здесь:

PHP БД долгая обработка
Visual C++ Долгая компиляция
Assembler Что такое инициализация сегментов или инициализация регистров?
долгая загрузка Android
C# Долгая отрисовка
Lenovo G550 долгая инициализация при старте
Android Инициализация OpenGL ES
Android TextToSpeech, как вызвать speak несколько раз подряд?
Android Работа с TextToSpeech
Android Инициализация базы данных
Android Инициализация переменной
Android Динамическая инициализация ImageView

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 17:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru