如何使用 Google TTS java 客户端修复 "Could not find policy 'pick_first'"?
How to fix "Could not find policy 'pick_first'" with Google TTS java client?
我无法使用 java 中的 Google TTS 客户端库发出请求。每次它抛出一堆异常。
我只是尝试获取可用语音列表。
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 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$ChannelTransportProviderExitIdleModeForTransport.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)。
io.grpc
库从您的 META-INF/services
中的文件注册 classes。
因此,在该文件夹中创建一个名为 io.grpc.LoadBalancerProvider
的文件,内容为:
io.grpc.internal.PickFirstLoadBalancerProvider
图书馆应该这样找到 class。
您还可以在 io.grpc.LoadBalancerProvider
中创建多个条目。对于 Google 的 Pub/Sub
库(Google 聊天机器人消息传递中间件),我看到以下内容:
io.grpc.grpclb.GrpclbLoadBalancerProvider
io.grpc.internal.PickFirstLoadBalancerProvider
io.grpc.util.SecretRoundRobinLoadBalancerProvider$Provider
如果您正在创建一个 fat/shaded jar,那么多个条目是一个问题,因为这些条目会相互覆盖。
如果您将 Gradle 与 ShadowJar 插件一起使用,这就是您合并来自各种 gRPC 库的服务文件内容所需的全部内容:
shadowJar {
mergeServiceFiles()
}
从线程 here 中发现。
另一种解决方案。希望能帮到一些人。
问题是 io.grpc.INTERNAL.PickFirstLoadBalacerProvider class 的包名。
在使用 grpc 之前插入下面的代码行。
import com.google.cloud.internal.PickFirstLoadBalancer;
...
LoadBalancerRegistry.getDefaultRegistry().register(new PickFirstLoadBalancerProvider());
LoadBalancerProvider 注册在 LoadBalancerRegistry 的 map 上,map 的 key 是 class 的名称(不准确但无所谓)。所以 LoadBalancerRegistry returns 新注册 class 到 grpc.
如果您使用 Maven 和 maven-shade 插件,请务必配置 ServicesResourceTransformer:
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
这可能是因为您的依赖项已包含在其他依赖项中但版本不同。
我无法使用 java 中的 Google TTS 客户端库发出请求。每次它抛出一堆异常。
我只是尝试获取可用语音列表。
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 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$ChannelTransportProviderExitIdleModeForTransport.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)。
io.grpc
库从您的 META-INF/services
中的文件注册 classes。
因此,在该文件夹中创建一个名为 io.grpc.LoadBalancerProvider
的文件,内容为:
io.grpc.internal.PickFirstLoadBalancerProvider
图书馆应该这样找到 class。
您还可以在 io.grpc.LoadBalancerProvider
中创建多个条目。对于 Google 的 Pub/Sub
库(Google 聊天机器人消息传递中间件),我看到以下内容:
io.grpc.grpclb.GrpclbLoadBalancerProvider
io.grpc.internal.PickFirstLoadBalancerProvider
io.grpc.util.SecretRoundRobinLoadBalancerProvider$Provider
如果您正在创建一个 fat/shaded jar,那么多个条目是一个问题,因为这些条目会相互覆盖。
如果您将 Gradle 与 ShadowJar 插件一起使用,这就是您合并来自各种 gRPC 库的服务文件内容所需的全部内容:
shadowJar {
mergeServiceFiles()
}
从线程 here 中发现。
另一种解决方案。希望能帮到一些人。
问题是 io.grpc.INTERNAL.PickFirstLoadBalacerProvider class 的包名。 在使用 grpc 之前插入下面的代码行。
import com.google.cloud.internal.PickFirstLoadBalancer;
...
LoadBalancerRegistry.getDefaultRegistry().register(new PickFirstLoadBalancerProvider());
LoadBalancerProvider 注册在 LoadBalancerRegistry 的 map 上,map 的 key 是 class 的名称(不准确但无所谓)。所以 LoadBalancerRegistry returns 新注册 class 到 grpc.
如果您使用 Maven 和 maven-shade 插件,请务必配置 ServicesResourceTransformer:
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
这可能是因为您的依赖项已包含在其他依赖项中但版本不同。