Отправляет email-рассылки с помощью сервиса Sendsay

[prg] Проблема с ru_tts на андроид

In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe:
List-Post:List-Owner:List-Archive;
bh=F4bymKi77v4w42Aimo5AwyHnECxH2c2/lqv+iGSjkxs=;
b=Bj0+fN3AnyJWx8pp/Y0RLyw1DC
SSEEo4oQSQblJzDQFoOpjsHgYRuGZAj1FHeiDL8t9cQkPro7Hd/NCT4TM3ZXeH4ankYwAU0J8yys
j
JysNKuTH4PvI9f4xxd/8v6+qPNfVdW4pRIjzdIlPmH7D7iZ4PtFUIlFMFL5dq1FyyRUs=;

Здравствуйте, industry.
Собрал из ранее выложеных исходников ru_tts сошную библиотеку, и занялся её тестированием,
работаю в eclipse, всё вроде откомпилировалось, только после запуска на телефоне, программа вылетает, в логах получаю такую ошибку:
E AndroidRuntime: java.lang.UnsatisfiedLinkError: No implementation found for void com.newfon.ttstest.RussianVoiceEngine.speak(java.lang.String) (tried Java_com_newfon_ttstest_RussianVoiceEngine_speak and Java_com_newfon_ttstest_RussianVoiceEngine_speak__Ljava_lang_String_2).
что было сделано:
создан класс "RussianVoiceEngine.java",
вкотором вызываю библиотеку:
System.loadLibrary("ruvoicesynth");
в данном классе есть такая строка:
native void speak(String text);
Дальше переходим в главную активность и пишем, создаём переменную:
private RussianVoiceEngine speack;
и в onCreate вызываем:
speack = new RussianVoiceEngine();
speack.speak("privet");
Вот и всё, программа вылетает.
Всем зарание огромное спасибо.

Ответы:

Добрый вечер.

ДДа, все правильно,. именно по такому пакету не т implementation.
там по уумолчанию используется пакет tts.synth.

если вы хотите изменить поведение, вам нужно будет поменять имя пакета, и по желанию класса в коде jni.

Ответить   Thu, 15 Jul 2021 19:07:09 +0400 (#3673646)

 

Здравствуйте, gozaltech.

Вы писали 15 июля 2021 г., 18:07:09:

Название пакета поменял, но всё равно вылетает программа.
на вот этом куске кода тоже ошибка
speechCallback(byte[] audioBuffer)
{
// Sound stream playback implementation
}
либо просится return во внутрь, либо передвпереди поставить void но всё равно вылетает.
и я в главной активности не использую
speechCallback
А если его использовать тогда как?
Всем спасибо.

Ответить   Fri, 16 Jul 2021 17:08:34 +0300 (#3673694)

 

Добрый вечер.

Что пишет отладчик когда вылетает программа?

Ответить   Fri, 16 Jul 2021 21:28:26 +0400 (#3673705)

 

Здравствуйте, gozaltech.

Вы писали 16 июля 2021 г., 20:28:26:

Вот что выдаёт лог:
F libc : Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 10352 (tts.synth), pid 10352 (tts.synth)
F DEBUG : pid: 10352, tid: 10352, name: tts.synth >>> tts.synth <<<
F DEBUG : Abort message: 'java_vm_ext.cc:542] JNI DETECTED ERROR IN APPLICATION: JNI GetStringLength called with pending exception java.lang.NoSuchMethodError: no non-static method "Ltts/synth/RussianVoiceEngine;.speechCallback([B)Z"'
F DEBUG : Abort message: 'java_vm_ext.cc:542] JNI DETECTED ERROR IN APPLICATION: JNI GetStringLength called with pending exception java.lang.NoSuchMethodError: no non-static method "Ltts/synth/RussianVoiceEngine;.speechCallback([B)Z"'
F DEBUG : #09 pc 0000146d /data/app/tts.synth-M212p5Lu2vyten21xXT_5Q==/lib/arm/libruvoicesynth.so (Java_tts_synth_RussianVoiceEngine_speak+56)
F DEBUG : #18 pc 00000690 /dev/ashmem/dalvik-classes.dex extracted in memory from /data/app/tts.synth-M212p5Lu2vyten21xXT_5Q==/base.apk (deleted) (tts.synth.MainActivity$1.onClick+16)
F libc : Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 10448 (tts.synth), pid 10448 (tts.synth)

Ответить   Fri, 16 Jul 2021 23:03:10 +0300 (#3673718)

 

Здравствуйте, Владислав.

Вы писали 16 июля 2021 г., 23:03:10:

Короче вроде перестало выбивать приложение, но всё равно не говорит со мною.
Вот что я написал:
boolean speechCallback(byte[] audioBuffer) {
return applyIntonation;
// Sound stream playback implementation
}
А в главной активности написал так:
speack = new RussianVoiceEngine();
speack.speak("Привет, это мой тестовый голос!");
Но при запуске приложения голос молчит.
Может в главной активности ещё что-то нужно дописать, чтоб фонемофон заговорил?
Всем большое спасибо!

Ответить   Sat, 17 Jul 2021 16:43:42 +0300 (#3673751)

 

Добрый вечер.

Так вы не реализовали проигрывание полученных семплов, по этому у вас синтезатор и не разговаривает.

вам нужно проиграть семплы, которые приходят в колбек в параметр audioBuffer.
10000 килогерц, 8бит, моно аудио.
можете наверно использовать AudioTrack для этого.

Ответить   Sat, 17 Jul 2021 19:04:02 +0400 (#3673752)

 

Здравствуйте, gozaltech.

Вы писали 17 июля 2021 г., 18:04:02:

Как-то получилось реализовать, но звучит только кусочек первого слова.
Вот моя реализация в конструкторе:
Есть глобальная переменная
private audio AudioTrack;
audio = new AudioTrack(AudioManager.STREAM_MUSIC, 10000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_8BIT, audioBufferSize, AudioTrack.MODE_STREAM);
if (audio.getState() == AudioTrack.STATE_INITIALIZED)
audio.play();
И вот метод:
boolean speechCallback(final byte[] audioBuffer)
{
if (audio == null || audio.getState()!= AudioTrack.STATE_INITIALIZED || audioBuffer == null) return false;
audio.write(audioBuffer, 0, audioBuffer.length);
return true;
}

Ответить   Mon, 19 Jul 2021 15:36:33 +0300 (#3673831)

 

Доброе утро.

Вообще странно, возможно он не успевает записать в track весь буффер, который у него есть, или может в этот собственно момент больше данных и нет.

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

Ответить   Tue, 20 Jul 2021 10:52:40 +0400 (#3673870)

 

Здравствуйте, gozaltech.

Вы писали 20 июля 2021 г., 9:52:40:

Вот переписал метод, максимум чего я достиг, это улучшилось качество
звучания, а фразу не дочитывает.
Вот моя реализация:
boolean speechCallback(final byte[] audioBuffer)
{
for (int i = 0; i < audioBuffer.length; i++)
{
audioBuffer[i] = (byte) (audioBuffer[i] +128);
}
if (audio == null || audio.getState()!= AudioTrack.STATE_INITIALIZED || audioBuffer == null) return false;
{
audio.write(audioBuffer, 0, audioBuffer.length);
}
return true;
}

Ответить   Wed, 21 Jul 2021 13:14:29 +0300 (#3673918)

 

Здравствуйте, Владислав.

Вы писали 21 июля 2021 г., 13:14:29:
А вот если поставить вконце метода
return false;
Тогда вроде читает фразу полностью, но всё равно его нельзя
остановить.

Ответить   Wed, 21 Jul 2021 13:29:19 +0300 (#3673919)

 

Приветствую всех!
Не забывайте вызывать flush(). Например:
speack.speak("Привет, это мой тестовый голос!");

audio.flush();

Успехов. Анатолий.

Ответить   i_chay Tue, 20 Jul 2021 13:24:04 +0400 (#3673876)

 

17 июля 2021 г., в 01:28, gozaltech <be***@l*****.ru> написал:

Здравствуйте, gozaltech!
Предупреждение за избыточное цитирование.
С уважением, комодератор Александр Зеленов
TC-Mode***@g*****.io