IBM语音转文本的Retrofit2身份验证错误

问题描述 投票:0回答:1

我正在尝试不使用库而访问IBM的语音转文本服务。我正在对GSON使用翻新。

问题出在认证中,显然没有正确进行,返回了代码401。从official documentation,HTTP请求应采用这种格式

curl -X POST -u "apikey:{apikey}" \
--header "Content-Type: audio/flac" \
--data-binary @{path_to_file}audio-file.flac \
"{url}/v1/recognize"

[使用我的凭据测试curl命令时,该服务运行正常。

这是我正在使用的界面

interface SpeechToTextApi {

    @Multipart
    @POST("v1/recognize")
    fun speechToText(
        @Header("Authorization") authKey: String,
        @Part("file") filename: RequestBody,
        @Part voiceFile: MultipartBody.Part
    ): Call<List<SpeechToText>>
}

我具有以下数据类的地方

data class SpeechToText(val results: List<SttResult>)
data class SttResult(val alternatives: List<RecognitionResult>, val final: Boolean)
data class RecognitionResult(val confidence: Float, val transcript: String)

这就是我设置翻新的方式

private val retrofit = Retrofit.Builder()
        .baseUrl(STT_BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build()

private val service = retrofit.create(SpeechToTextApi::class.java)

在调用实际服务时看起来像这样

val requestFile = RequestBody.create(MediaType.parse("audio/mp3"), file.name)
val body = MultipartBody.Part.createFormData("file", file.name, requestFile)
service
    .speechToText(getString(R.string.stt_iam_api_key), requestFile, body)
    .enqueue(object: Callback<List<SpeechToText>> {
    override fun onResponse(call: Call<List<SpeechToText>>, response: Response<List<SpeechToText>>) {
        val listOfStts = response.body()
        Log.d(TAG, "Response code: ${response.code()}")
        if (listOfStts != null) {
            for (stt in listOfStts) {
                for (res in stt.results) {
                    Log.d(TAG, "Final value: ${res.final}")
                    for (alt in res.alternatives) {
                        Log.d(TAG, "Alternative confidence: ${alt.confidence}\nTranscript: ${alt.transcript}")
                        Toast.makeText(this@MainActivity, alt.transcript, Toast.LENGTH_SHORT).show()
                    }
                }
            }
        }
    }

    override fun onFailure(call: Call<List<SpeechToText>>, t: Throwable) {
        Log.d(TAG, "Error: ${t.message}")
        t.printStackTrace()
    }
})

录音是MP3文件,我相信它们可以正确存储并且可以访问。我也用audio/flac替换了audio/mp3

问题似乎是身份验证的工作方式。在上面显示的代码之前,我使用过

private val retrofit = Retrofit.Builder()
        .baseUrl(STT_BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .client(OkHttpClient.Builder()
            .addInterceptor { chain ->
                val request = chain.request()
                val headers = request
                    .headers()
                    .newBuilder()
                    .add("Authorization", getString(R.string.stt_iam_api_key))
                    .build()
                val finalRequest = request.newBuilder().headers(headers).build()
                chain.proceed(finalRequest)
            }
            .build())
    .build()

但是相同的响应代码401仍然存在。当然,接口方法缺少@Header参数。

非常感谢您的帮助。

android kotlin retrofit2 ibm-watson
1个回答
0
投票

由于错误提示缺少"Content-Type: audio/flac"标头,所以添加:-

@Headers("Content-Type: audio/flac")

对于服务方法,即

fun speechToText(
    @Header("Authorization") authKey: String,
    @Part("file") filename: RequestBody,
    @Part voiceFile: MultipartBody.Part
): Call<List<SpeechToText>>
© www.soinside.com 2019 - 2024. All rights reserved.