微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Android 4.2 上运行谷歌云语音 API

如何解决在 Android 4.2 上运行谷歌云语音 API

我在 Android 4.2 设备上运行 io.grpc:grpc-okhttp 时遇到问题。

我已经实现了 SpeechClient with Credentials,用于运行谷歌云语音到文本。 在 Android 7.1 设备上我没有问题。问题发生在 Android 4.2

所以在我的起始gradle中

implementation 'io.grpc:grpc-okhttp:1.35.0'
implementation 'io.grpc:grpc-android:1.35.0'
implementation 'com.google.cloud:google-cloud-speech:1.24.0'

问题。

  1. 一个问题是 SSL 的 TLS 安全性(在 Android 4.2 上太旧了)。为此,我添加了依赖

    implementation 'org.conscrypt:conscrypt-android:2.5.1'
    

    并在我的 DialogFragment(正在运行代码)中实现

     Security.insertProviderAt(Conscrypt.newProvider(),1) 
    
  2. 在我实现这个之后,我得到了

    Duplicate class org.conscrypt.AbstractConscryptEngine found in modules jetified-conscrypt-android-2.5.1-runtime (org.conscrypt:conscrypt-android:2.5.1) and jetified-conscrypt-openjdk-uber-2.2.1 (org.conscrypt:conscrypt-openjdk-uber:2.2.1)
    

    问题(很多重复的类) 所以为了解决这个问题,我添加

    configurations {
       all {
          exclude group: "org.conscrypt",module: "conscrypt-openjdk-uber"
       }
     }
    
  3. 现在我收到此错误,因为 com.google.api.client 使用的是 Standard.UTF-8,而我的设备运行的是 Android 17。

com.google.api.gax.rpc.UnauthenticatedException: io.grpc.StatusRuntimeException: UNAUTHENTICATED: Failed computing credential Metadata
        at com.google.api.gax.rpc.ApiExceptionFactory.createException(ApiExceptionFactory.java:73)
        at com.google.api.gax.grpc.GrpcApiExceptionFactory.create(GrpcApiExceptionFactory.java:72)
        at com.google.api.gax.grpc.GrpcApiExceptionFactory.create(GrpcApiExceptionFactory.java:60)
        at com.google.api.gax.grpc.ExceptionResponSEObserver.onErrorImpl(ExceptionResponSEObserver.java:82)
        at com.google.api.gax.rpc.StateCheckingResponSEObserver.onError(StateCheckingResponSEObserver.java:86)
        at com.google.api.gax.grpc.GrpcDirectStreamController$ResponSEObserverAdapter.onClose(GrpcDirectStreamController.java:149)
        at io.grpc.internal.ClientCallImpl.cloSEObserver(ClientCallImpl.java:426)
        at io.grpc.internal.ClientCallImpl.access$500(ClientCallImpl.java:66)
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:689)
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$900(ClientCallImpl.java:577)
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:751)
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:740)
        at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
        at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390)
        at java.util.concurrent.FutureTask.run(FutureTask.java:234)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:153)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:267)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
        at java.lang.Thread.run(Thread.java:856)
     Caused by: io.grpc.StatusRuntimeException: UNAUTHENTICATED: Failed computing credential Metadata
        at io.grpc.Status.asRuntimeException(Status.java:533)
        at com.google.api.gax.grpc.GrpcDirectStreamController$ResponSEObserverAdapter.onClose(GrpcDirectStreamController.java:149) 
        at io.grpc.internal.ClientCallImpl.cloSEObserver(ClientCallImpl.java:426) 
        at io.grpc.internal.ClientCallImpl.access$500(ClientCallImpl.java:66) 
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:689) 
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$900(ClientCallImpl.java:577) 
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:751) 
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:740) 
        at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) 
        at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) 
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:153) 
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:267) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
        at java.lang.Thread.run(Thread.java:856) 
     Caused by: java.lang.NoClassDefFoundError: java.nio.charset.StandardCharsets
        at com.google.api.client.util.StringUtils.getBytesUtf8(StringUtils.java:51)
        at com.google.api.client.json.webtoken.JsonWebSignature.signUsingRsaSha256(JsonWebSignature.java:571)
        at com.google.auth.oauth2.JwtCredentials.refresh(JwtCredentials.java:125)
        at com.google.auth.oauth2.JwtCredentials.getRequestMetadata(JwtCredentials.java:163)
        at com.google.auth.oauth2.ServiceAccountJwtAccessCredentials.getRequestMetadata(ServiceAccountJwtAccessCredentials.java:365)
        at com.google.auth.Credentials.blockingGetToCallback(Credentials.java:112)
        at com.google.auth.oauth2.ServiceAccountJwtAccessCredentials.getRequestMetadata(ServiceAccountJwtAccessCredentials.java:341)
        at io.grpc.auth.GoogleAuthLibraryCallCredentials.applyRequestMetadata(GoogleAuthLibraryCallCredentials.java:110)
        at io.grpc.CallCredentials2.applyRequestMetadata(CallCredentials2.java:58)
        at io.grpc.internal.CallCredentialsApplyingTransportFactory$CallCredentialsApplyingTransport.newStream(CallCredentialsApplyingTransportFactory.java:108)
        at io.grpc.internal.ForwardingConnectionClientTransport.newStream(ForwardingConnectionClientTransport.java:49)
        at io.grpc.internal.InternalSubchannel$CallTracingTransport.newStream(InternalSubchannel.java:671)
        at io.grpc.internal.DelayedClientTransport$PendingStream.createRealStream(DelayedClientTransport.java:353)
        at io.grpc.internal.DelayedClientTransport$PendingStream.access$300(DelayedClientTransport.java:341)

问题:

  1. 如何解决此问题并使用“ApiStreamObserver”运行语音? 我尝试将“io.grpc:grpc-”库恢复到 1.0 版或其他版本,但后来我遇到了其他问题...

解决方法

我已经解决了这个问题并在 Github 上提交了示例项目

https://github.com/DjToMeK27/CloudGoogleSpeechToText/tree/main

我在这个项目中做了什么

  1. 已下载https://github.com/GoogleCloudPlatform/android-docs-samples/blob/master/README.md
  2. 更改了 android-docs-samples-master\speech 项目 SpeechRecognitionClient 中的类
    • 更改了 AudoEmitter.kt 中的 AudioRecord 以支持 API 16
  3. 导入 org.conscrypt:conscrypt-android:2.5.1 库
    • 必须从 google-cloud-speech 中排除组 org.conscrypt(在 build.gradle 中)
  4. 为 Android 4.1 添加了 init { Security.insertProviderAt(Conscrypt.newProvider(),1) } 以运行适当的 TLS 以使 GRC 正常工作
  5. 我下载了 https://github.com/googleapis 项目
    • 将 google-http-client 中的所有 StandardCharset 更改为 Charset.forName())
    • 并且还更改了一些测试以使其正常工作
    • https://imgur.com/a/iU7yjCZ(文件更改)
  6. 我已经构建了这个项目并添加了 .jar 文件,我将其包含在此处
  7. 现在它起作用了!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?