尝试使用google-cloud-speech库时出现错误。
这可能与我的依赖有关。在添加Firebase身份验证依赖项之前,该库可以无缝运行。因此,可能与endpoints-management-control-appengine-all依赖性有关。
Stackdriver日志:
com.google.api.server.spi.SystemService invokeServiceMethod:异常 调用后端方法(SystemService.java:373)时发生 java.util.concurrent.ExecutionException:java.lang.NoSuchFieldError: CONTEXT_SPAN_KEY,位于 com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:503) 在 com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:462) 在 com.google.common.util.concurrent.AbstractFuture $ TrustedFuture.get(AbstractFuture.java:79) 在 com.google.common.util.concurrent.ForwardingFuture.get(ForwardingFuture.java:62) 在 com.google.api.gax.longrunning.OperationFutureImpl.get(OperationFutureImpl.java:127) 在 com.codefan.backend.util.AudioRecognizer.getRecognizedSpeechResults(AudioRecognizer.java:45) 在 com.codefan.backend.util.SubtitleGenerator.generate(SubtitleGenerator.java:34) 在 com.codefan.backend.endpoint.SubtitleApi.generateSubtitles(SubtitleApi.java:92) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:498)在 com.google.api.server.spi.SystemService.invokeServiceMethod(SystemService.java:349) 在 com.google.api.server.spi.handlers.EndpointsMethodHandler $ RestHandler.handle(EndpointsMethodHandler.java:127) 在 com.google.api.server.spi.handlers.EndpointsMethodHandler $ RestHandler.handle(EndpointsMethodHandler.java:110) 在 com.google.api.server.spi.dispatcher.PathDispatcher.dispatch(PathDispatcher.java:50) 在 com.google.api.server.spi.EndpointsServlet.service(EndpointsServlet.java:80) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:790)处 com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:287) 在 com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:277) 在 com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:182) 在 com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91) 在 com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:85) 在 com.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:48) 在 com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82) 在com.google.api.control.ConfigFilter.doFilter(ConfigFilter.java:125) 在 com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82) 在 com.google.api.control.ControlFilter.doFilter(ControlFilter.java:229) 在 com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82) 在 com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:119) 在com.google.inject.servlet.GuiceFilter $ 1.call(GuiceFilter.java:133) 在com.google.inject.servlet.GuiceFilter $ 1.call(GuiceFilter.java:130) 在 com.google.inject.servlet.GuiceFilter $ Context.call(GuiceFilter.java:203) 在 com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:130) 在 org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1759) 在 com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60) 在 org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1759) 在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:582) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 在 org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524) 在 org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) 在 com.google.apphosting.runtime.jetty9.ParseBlobUploadHandler.handle(ParseBlobUploadHandler.java:119) 在 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1182) 在 com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.doHandle(AppEngineWebAppContext.java:183) 在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:512) 在 org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 在 com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:293) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) 在org.eclipse.jetty.server.Server.handle(Server.java:539)处 org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:333)在 com.google.apphosting.runtime.jetty9.RpcConnection.handle(RpcConnection.java:213) 在 com.google.apphosting.runtime.jetty9.RpcConnector.serviceRequest(RpcConnector.java:81) 在 com.google.apphosting.runtime.jetty9.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:123) 在 com.google.apphosting.runtime.JavaRuntime $ RequestRunnable.dispatchServletRequest(JavaRuntime.java:692) 在 com.google.apphosting.runtime.JavaRuntime $ RequestRunnable.dispatchRequest(JavaRuntime.java:655) 在 com.google.apphosting.runtime.JavaRuntime $ RequestRunnable.run(JavaRuntime.java:625) 在 com.google.apphosting.runtime.JavaRuntime $ NullSandboxRequestRunnable.run(JavaRuntime.java:817) 在 com.google.apphosting.runtime.ThreadGroupPool $ PoolEntry.run(ThreadGroupPool.java:269) 在java.lang.Thread.run(Thread.java:748)造成原因: java.lang.NoSuchFieldError:CONTEXT_SPAN_KEY,位于 io.grpc.internal.CensusTracingModule $ TracingClientInterceptor.interceptCall(CensusTracingModule.java:384) 在 io.grpc.ClientInterceptors $ InterceptorChannel.newCall(ClientInterceptors.java:156) 在 io.grpc.internal.CensusStatsModule $ StatsClientInterceptor.interceptCall(CensusStatsModule.java:690) 在 io.grpc.ClientInterceptors $ InterceptorChannel.newCall(ClientInterceptors.java:156) 在 com.google.api.gax.grpc.GrpcChannelUUIDInterceptor.interceptCall(GrpcChannelUUIDInterceptor.java:52) 在 io.grpc.ClientInterceptors $ InterceptorChannel.newCall(ClientInterceptors.java:156) 在 com.google.api.gax.grpc.GrpcHeaderInterceptor.interceptCall(GrpcHeaderInterceptor.java:80) 在 io.grpc.ClientInterceptors $ InterceptorChannel.newCall(ClientInterceptors.java:156) 在 com.google.api.gax.grpc.GrpcMetadataHandlerInterceptor.interceptCall(GrpcMetadataHandlerInterceptor.java:55) 在 io.grpc.ClientInterceptors $ InterceptorChannel.newCall(ClientInterceptors.java:156) 在 io.grpc.internal.ManagedChannelImpl.newCall(ManagedChannelImpl.java:789) 在 io.grpc.internal.ForwardingManagedChannel.newCall(ForwardingManagedChannel.java:63) 在 com.google.api.gax.grpc.GrpcClientCalls.newCall(GrpcClientCalls.java:90) 在 com.google.api.gax.grpc.GrpcDirectCallable.futureCall(GrpcDirectCallable.java:58) 在 com.google.api.gax.grpc.GrpcExceptionCallable.futureCall(GrpcExceptionCallable.java:64) 在 com.google.api.gax.rpc.AttemptCallable.call(AttemptCallable.java:86) 在 com.google.api.gax.rpc.RetryingCallable.futureCall(RetryingCallable.java:63) 在 com.google.api.gax.rpc.RetryingCallable.futureCall(RetryingCallable.java:41) 在 com.google.api.gax.grpc.GrpcOperationSnapshotCallable.futureCall(GrpcOperationSnapshotCallable.java:58) 在 com.google.api.gax.tracing.TracedUnaryCallable.futureCall(TracedUnaryCallable.java:75) 在 com.google.api.gax.tracing.TracedOperationInitialCallable.futureCall(TracedOperationInitialCallable.java:61) 在 com.google.api.gax.rpc.OperationCallableImpl.futureCall(OperationCallableImpl.java:82) 在 com.google.api.gax.tracing.TracedOperationCallable.futureCall(TracedOperationCallable.java:78) 在 com.google.api.gax.rpc.OperationCallable $ 1.futureCall(OperationCallable.java:150) 在 com.google.api.gax.rpc.OperationCallable.futureCall(OperationCallable.java:67) 在 com.google.cloud.speech.v1.SpeechClient.longRunningRecognizeAsync(SpeechClient.java:360) 在 com.google.cloud.speech.v1.SpeechClient.longRunningRecognizeAsync(SpeechClient.java:320) 在 com.codefan.backend.util.AudioRecognizer.getRecognizedSpeechResults(AudioRecognizer.java:39) ...还有57个
这是AudioRecognizer
类的唯一方法:
@Override
public List<SpeechRecognitionResult> getRecognizedSpeechResults(String sourceLang, int sampleRate, String gcsUri) throws IOException, InterruptedException, ExecutionException {
SpeechClient speechClient = SpeechClient.create();
RecognitionConfig config = RecognitionConfig.newBuilder()
.setEncoding(AudioEncoding.FLAC)
.setLanguageCode(sourceLang)
.setSampleRateHertz(sampleRate)
.setEnableWordTimeOffsets(true)
.build();
RecognitionAudio audio = RecognitionAudio.newBuilder().setUri(gcsUri).build();
// Use non-blocking call for getting file transcription
OperationFuture<LongRunningRecognizeResponse, LongRunningRecognizeMetadata> speechRecResponse = speechClient.longRunningRecognizeAsync(config, audio);
while (!speechRecResponse.isDone()) {
logger.warning("Waiting for response...");
Thread.sleep(10000);
}
return speechRecResponse.get().getResultsList();
}
项目的依赖项:
<dependencies>
<dependency>
<groupId>com.google.endpoints</groupId>
<artifactId>endpoints-framework</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.google.endpoints</groupId>
<artifactId>endpoints-framework-guice</artifactId>
<version>2.2.0</version>
</dependency>
<!-- [START api_management] -->
<dependency>
<groupId>com.google.endpoints</groupId>
<artifactId>endpoints-management-control-appengine-all</artifactId>
<version>1.0.11</version>
</dependency>
<!-- [END api_management] -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-speech</artifactId>
<version>0.87.0-beta</version>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-translate</artifactId>
<version>1.69.0</version>
</dependency>
<!-- [START Objectify_Dependencies] -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>22.0</version>
</dependency>
<dependency>
<groupId>com.googlecode.objectify</groupId>
<artifactId>objectify</artifactId>
<version>5.1.21</version>
</dependency>
<!-- [END Objectify_Dependencies] -->
<!-- [START Test_Dependencies] -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- [END Test_Dependencies] -->
</dependencies>
答案 0 :(得分:0)
要添加api管理,我浏览了this post。它指示使用 endpoints-management-control-appengine-all 库。
稍后,当我检查该库的编译依赖项时,我看不到任何东西。他们可能在不使用任何依赖项的情况下将代码填充到库中,这就是为什么我的指示器具有 -all 的原因。这导致具有相同类的多个实例。由于未定义任何依赖项,因此maven无法在多个依赖项中选择一个。
简而言之,这是由从多个位置扫描的类引起的。
幸运的是,该库还有其他选择。这是我现在用于api管理的依赖项。
<dependency>
<groupId>com.google.endpoints</groupId>
<artifactId>endpoints-management-control-appengine</artifactId>
<version>1.0.11</version>
</dependency>
<dependency>
<groupId>com.google.endpoints</groupId>
<artifactId>endpoints-framework-auth</artifactId>
<version>1.0.11</version>
</dependency>
由于我没有添加 all 所有东西,因此我的项目中的代码可能更少。