Страница 3 из 6

Re: Демонстрация возможностей системы

Добавлено: Вт ноя 14, 2017 11:31 pm
OlegM
alekszander писал(а):коллеги, подскажите как сейчас реализовать скрипт DemoSay. Посмотрел по Connect у других пользователей, не говорит ни чего. Есть ли рабочая реализация?
Коллеги помогите. Очень надо.
Это работает замечательно
if (gg('DemoCancel')) {
return;
}

$ph='';

if (!is_array($params)) {
$ph=$params;
}


if (!$ph) {
$ph="Hello, world!";
}

$yandex_file=YandexTTS($ph, 'en');

if ($yandex_file) {
@touch($yandex_file);
system('/usr/bin/mplayer '.$yandex_file);

}

Re: Демонстрация возможностей системы

Добавлено: Ср ноя 15, 2017 9:36 am
OlegM
Да и еще... Вместо

Код: Выделить всё

system('/usr/bin/mplayer '.$yandex_file); 
можно использовать

Код: Выделить всё

playSound($yandex_file, 1); 
Вдогонку Сергею. Почему голос работает только на сервере? Когда Алиса говорит и пишет сама, то работает на всех устройствах, а данном случае только на сервере.

Re: Демонстрация возможностей системы

Добавлено: Ср ноя 15, 2017 2:36 pm
alekszander
OlegM писал(а):
alekszander писал(а):коллеги, подскажите как сейчас реализовать скрипт DemoSay. Посмотрел по Connect у других пользователей, не говорит ни чего. Есть ли рабочая реализация?
Коллеги помогите. Очень надо.
Это работает замечательно
if (gg('DemoCancel')) {
return;
}

$ph='';

if (!is_array($params)) {
$ph=$params;
}


if (!$ph) {
$ph="Hello, world!";
}

$yandex_file=YandexTTS($ph, 'en');

if ($yandex_file) {
@touch($yandex_file);
system('/usr/bin/mplayer '.$yandex_file);

}
При попытке вызова ругается на ошибку

Код: Выделить всё

Fatal error: Call to undefined function yandex_tts() in /var/www/modules/scripts/scripts.class.php(139) : eval()'d code on line 16

Re: Демонстрация возможностей системы

Добавлено: Ср ноя 15, 2017 4:01 pm
OlegM
alekszander писал(а): При попытке вызова ругается на ошибку

Код: Выделить всё

Fatal error: Call to undefined function yandex_tts() in /var/www/modules/scripts/scripts.class.php(139) : eval()'d code on line 16
Смотря какая у Вас платформа. Данный пример для Linux.
Вообще я еще дал второй пример. Он для любой платформы.
И по ходу у Вас не обновленная версия портала. Судя по ошибки функции YandexTTS() у Вас нет. Хотя она добавлена в файле lib/tts.class.php
У Вас наверное там только функция GoogleTTS()
Если в указанном файле у Вас нет этой функции, то либо обновитесь, либо в конец добавьте код:

Код: Выделить всё

/**
 * YandexTTS
 * @param mixed $message Message
 * @param mixed $lang    Language (default 'ru-RU')
 * @return int|string
 */
function YandexTTS($message, $lang = 'ru-RU')
{
   $filename       = md5($message) . '_ya.mp3';
   $cachedVoiceDir = ROOT . 'cached/voice';
   $cachedFileName = $cachedVoiceDir . '/' . $filename;
   $base_url       = 'https://tts.voicetech.yandex.net/generate?';

   if (file_exists($cachedFileName))
   {
      @touch($cachedFileName);

      return $cachedFileName;
   }
   
   $qs = http_build_query(array('format' => 'mp3', 'lang' => $lang, 'speaker' => 'omazh', 'key' => SETTINGS_YANDEX_TTS_KEY, 'text' => $message));

   try
   {
      $contents = file_get_contents($base_url . $qs);
   }
   catch (Exception $e)
   {
      registerError('yandextts', get_class($e) . ', ' . $e->getMessage());
   }
   
   if (isset($contents))
   {
      CreateDir($cachedVoiceDir);

      SaveFile($cachedFileName, $contents);

      return $cachedFileName;
   }
   
   return 0;
} 

Re: Демонстрация возможностей системы

Добавлено: Ср ноя 15, 2017 4:12 pm
skysilver
alekszander писал(а):При попытке вызова ругается на ошибку

Код: Выделить всё

Fatal error: Call to undefined function yandex_tts() in /var/www/modules/scripts/scripts.class.php(139) : eval()'d code on line 16
Функция yandex_tts() уже давно не входит в состав ядра МДМ, а распространяется в составе отдельного модуля. Поэтому если есть необходимость ее использовать в своих сценариях и методах, то надо сначала подключить файлы из этого модуля, в которых она объявлена.

Re: Демонстрация возможностей системы

Добавлено: Ср ноя 15, 2017 8:21 pm
OlegM
skysilver писал(а):Функция yandex_tts() уже давно не входит в состав ядра МДМ, а распространяется в составе отдельного модуля. Поэтому если есть необходимость ее использовать в своих сценариях и методах, то надо сначала подключить файлы из этого модуля, в которых она объявлена.
Не знаю на счет как используется или нет, во всяком случае она работоспособна в отличии от google_tts. А то приложение от яндекс в данном случае не подойдет, т.к. с проговариванием еще будет и в терминале писать. А это не нужно. В общих настройках есть поле ключа яндек, и никто его не убирал. Что очень хорошо.

Посидел сегодня и подумал насчет переводов текстов. В тот-же файл tts.class.php с google_tts и yandex_tts добавил небольшую функцию в виде костыля

Код: Выделить всё

function YandexTranslate($message, $lang = 'en-ru')
{
 $yt_api_key = "Здесь сам ключ"; // Получить тут: https://tech.yandex.ru/keys/get/?service=trnsl
 $message = urlencode($message);
 
 $yt_link = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=".$yt_api_key."&text=".$message."&lang=".$lang;

 $result = file_get_contents($yt_link);
 $result = json_decode($result, true);
 $en_test = $result['text'][0];

 return $en_test;
}
 
А в сценарий DemoSay внес небольшое изменени

Код: Выделить всё

$ph=YandexTranslate($params); 
Неплохо переводит :D

Кто-бы взял этот костыль и доработал бы его до отдельного модуля. Было бы неплохо.

Re: Демонстрация возможностей системы

Добавлено: Ср ноя 15, 2017 9:59 pm
skysilver
OlegM писал(а):В тот-же файл tts.class.php с google_tts и yandex_tts добавил небольшую функцию в виде костыля
Нет больше файла /lib/tts.class.php в составе дистрибутива ядра. Этот момент я имел в виду выше.

Re: Демонстрация возможностей системы

Добавлено: Чт ноя 16, 2017 2:55 am
alekszander
Удалось избавиться от ошибки YandexTTS. Функцию подключил в самом скрипте DemoSay. Но теперь выходит друга проблема. При попытке произнести выходит ошибка.
СпойлерПоказать

Код: Выделить всё

Cannot find HOME directory. MPlayer2 2.0-728-g2c378c7-4+b1 (C) 2000-2012 MPlayer Team Terminal type `unknown' is not defined. Playing /var/www/cached/voice/b43dd0462bc99529e4c68c98a6dae7d6_ya.mp3. Failed to recognize file format. Exiting... (End of file)
При воспроизведении файла, файл весит 3-4 KB, и длительность 0 секунд. И если в скрипте больше одно DemoSay то тогда ругается на переобъявление функции.

Код: Выделить всё

Fatal error: Cannot redeclare YandexTTS() (previously declared in /var/www/modules/scripts/scripts.class.php(142) : eval()'d code:7) in /var/www/modules/scripts/scripts.class.php(142) : eval()'d code on line 35
И сразу вопрос. Если можно использовать сам модуль Yandex TTS как это сделать в данном случае (Через say не слишком хочется)

Re: Демонстрация возможностей системы

Добавлено: Чт ноя 16, 2017 9:42 am
OlegM
alekszander писал(а):Удалось избавиться от ошибки YandexTTS. Функцию подключил в самом скрипте DemoSay. Но теперь выходит друга проблема. При попытке произнести выходит ошибка.
СпойлерПоказать

Код: Выделить всё

Cannot find HOME directory. MPlayer2 2.0-728-g2c378c7-4+b1 (C) 2000-2012 MPlayer Team Terminal type `unknown' is not defined. Playing /var/www/cached/voice/b43dd0462bc99529e4c68c98a6dae7d6_ya.mp3. Failed to recognize file format. Exiting... (End of file)
При воспроизведении файла, файл весит 3-4 KB, и длительность 0 секунд. И если в скрипте больше одно DemoSay то тогда ругается на переобъявление функции.

Код: Выделить всё

Fatal error: Cannot redeclare YandexTTS() (previously declared in /var/www/modules/scripts/scripts.class.php(142) : eval()'d code:7) in /var/www/modules/scripts/scripts.class.php(142) : eval()'d code on line 35
И сразу вопрос. Если можно использовать сам модуль Yandex TTS как это сделать в данном случае (Через say не слишком хочется)
По первой ошибке, проверьте правильный ли ключ для API Yandex и есть ли у Вас он вообще. Кстати в сценарии он может по шаблону не определятся, т.е. не видеть его из настроек. Если по поводу последнего я не прав, то кто-то может поправить.
У Вас создаются mp3 файлы, но пустые. Проигрыватель не понимает формат файла.

По второй ошибке. Вы каждый раз запуская сценарий DemoSay переопределяете одну и ту-же функцию. Я выше писал если у Вас есть файл /lib/tts.class.php, то добавьте туда эту функцию. Если нет, то создайте ее и добавьте эту функцию туда. Либо в любой php файл в папке /lib Но второе не рекомендую, т.к. при обновлении придется заново добавлять.

Re: Демонстрация возможностей системы

Добавлено: Чт ноя 16, 2017 9:44 am
OlegM
skysilver писал(а):
OlegM писал(а):В тот-же файл tts.class.php с google_tts и yandex_tts добавил небольшую функцию в виде костыля
Нет больше файла /lib/tts.class.php в составе дистрибутива ядра. Этот момент я имел в виду выше.
У меня она осталась. Поэтому об этом и пишу. :D Модуль Yandex TTS не дает возможности произносить речь без текста в терминале. А в демонстрационном варианте текст в терминале не нужен.