Как исправить Не удалось найти политику pick_first с java-клиентом Google TTS?

Я не могу сделать запрос с помощью клиентской библиотеки Google TTS на java. Каждый раз выдает кучу исключений.

Я просто пытаюсь получить список доступных голосов.

    GoogleCredentials creds = null;
    TextToSpeechClient textToSpeechClient = null;
    try {
        creds = GoogleCredentials.fromStream(new FileInputStream(credsFile));
        TextToSpeechSettings settings = TextToSpeechSettings.newBuilder().setCredentialsProvider(FixedCredentialsProvider.create(creds)).build();
        textToSpeechClient = TextToSpeechClient.create(settings);
    } catch (IOException e) {
        e.printStackTrace();
        System.exit(-2);
    }

    if (cmd.hasOption('l')) {
        ListVoicesRequest request = ListVoicesRequest.getDefaultInstance();
        ListVoicesResponse response = textToSpeechClient.listVoices(request);
        List<Voice> voices = response.getVoicesList();
        System.out.println("Available voices :");
        for (Voice v : voices) {
            System.out.printf(" - %s, [%d]: %s/%s", v.getName(), v.getLanguageCodesCount(), v.getLanguageCodes(0), v.getSsmlGender());
        }
        textToSpeechClient.close();
        System.exit(0);
    }

Сначала я подумал, что это произошло из файла учетных данных. Но это не так, файл расположен правильно.

И я понял это.

avr. 02, 2019 11:36:46 PM io.grpc.internal.ManagedChannelImpl$1 uncaughtException
SEVERE: [Channel<1>: (texttospeech.googleapis.com:443)] Uncaught exception in the SynchronizationContext. Panic!
java.lang.IllegalStateException: Could not find policy 'pick_first'. Make sure its implementation is either registered to LoadBalancerRegistry or included in META-INF/services/io.grpc.LoadBalancerProvider from your jar files.
        at io.grpc.internal.AutoConfiguredLoadBalancerFactory$AutoConfiguredLoadBalancer.<init>(AutoConfiguredLoadBalancerFactory.java:93)
        at io.grpc.internal.AutoConfiguredLoadBalancerFactory.newLoadBalancer(AutoConfiguredLoadBalancerFactory.java:64)
        at io.grpc.internal.ManagedChannelImpl.exitIdleMode(ManagedChannelImpl.java:357)
        at io.grpc.internal.ManagedChannelImpl$ChannelTransportProvider$1ExitIdleModeForTransport.run(ManagedChannelImpl.java:455)
        at io.grpc.SynchronizationContext.drain(SynchronizationContext.java:101)
        at io.grpc.SynchronizationContext.execute(SynchronizationContext.java:130)
        at io.grpc.internal.ManagedChannelImpl$ChannelTransportProvider.get(ManagedChannelImpl.java:459)
        (...) a whole bunch of other lines

Как исправить эту ошибку?

Обратите внимание, что я использую последнюю версию библиотеки google-cloud-texttospeech (версия 0.85.0-beta).


person Gui-Yôm    schedule 02.04.2019    source источник
comment
Что такое политика pick_first и где ее реализация? Кроме того, появляются ли слова, вызванные by, в целой группе других строк?   -  person Abra    schedule 03.04.2019
comment
Я не знаю, что такое политика pick_first. Вот следующая Причина: Caused by: io.grpc.StatusRuntimeException: INTERNAL: Panic! This is a bug!. Это мало помогает. Однако я думаю, что это связано с балансировкой нагрузки серверов Google. В этом контексте «pick_first» будет означать выбор первого доступного сервера. Но похоже, что клиент не знает, как использовать эту стратегию.   -  person Gui-Yôm    schedule 04.04.2019
comment
Часто трассировка стека может содержать более одного Вызвано:. Обычно последний указывает на часть кода, в которой возникает исключение. Я всегда ищу в трассировке стека строки после последнего Caused by:, которые содержат написанные мной методы, то есть не сторонний код. Я спросил о pick_first, потому что он отображается в опубликованной вами трассировке стека: Could not find policy 'pick_first'   -  person Abra    schedule 04.04.2019
comment
Вот полная трассировка стека: https://pastebin.com/D7LqvhqT. Проблема в том, что я не вижу проблемы в своем коде. Stacktrace ссылается на эту строку в моем main (): textToSpeechClient.listVoices(request);   -  person Gui-Yôm    schedule 04.04.2019


Ответы (4)


Если вы используете Gradle с плагином ShadowJar, это все, что вам нужно для слияния содержимого служебных файлов из различных библиотек gRPC:

shadowJar {
    mergeServiceFiles()
}

Обнаружено в ветке здесь.

person Doug Stevenson    schedule 18.08.2020

Библиотека io.grpc регистрирует классы из файла в вашем META-INF/services.

Итак, создайте в этой папке файл с именем io.grpc.LoadBalancerProvider с содержимым:

io.grpc.internal.PickFirstLoadBalancerProvider

Таким образом библиотека должна найти класс.

person dhontecillas    schedule 12.04.2019
comment
Спасибо ! Но в итоге я больше не использовал эту библиотеку, я сам выполнял http-запросы. - person Gui-Yôm; 14.04.2019
comment
К сожалению, добавление этого файла не устранило проблему jar выше в проекте. - person Adam Hurwitz; 29.12.2019
comment
@AdamHurwitz убедитесь, что вы поместили файл в правильное место. Взгляните на эту ветку github (ссылка на соответствующий комментарий - здесь) - person jurl; 27.05.2020

Вы также можете создать несколько записей в io.grpc.LoadBalancerProvider. Что касается библиотеки Google Pub/Sub (промежуточное ПО для обмена сообщениями с ботами Google Chat), я вижу следующее:

io.grpc.grpclb.GrpclbLoadBalancerProvider
io.grpc.internal.PickFirstLoadBalancerProvider
io.grpc.util.SecretRoundRobinLoadBalancerProvider$Provider

Если вы создаете толстую / затемненную банку, возникает проблема с множественными записями, поскольку записи перезаписывают друг друга.

person halpdoge    schedule 06.05.2019

Другое решение. Надежда может кому-нибудь помочь.

Проблема заключается в имени пакета класса io.grpc.INTERNAL.PickFirstLoadBalacerProvider. Вставьте строки кода ниже, прежде чем использовать grpc.

import com.google.cloud.internal.PickFirstLoadBalancer;
...
LoadBalancerRegistry.getDefaultRegistry().register(new PickFirstLoadBalancerProvider());

LoadBalancerProviders зарегистрированы на карте в LoadBalancerRegistry, а ключ карты - это имя класса (не совсем, но не имеет значения). Таким образом, LoadBalancerRegistry возвращает недавно зарегистрированный класс в grpc.

person Youngrok Ko    schedule 11.06.2021
comment
Спасибо. Это мне помогло. Необходимо зарегистрировать grpclb LoadBalancerRegistry.getDefaultRegistry().register(GrpclbLoadBalancerProvider()) - person casey; 24.07.2021