使用 Python 将云语音 API 的结果导出到 JSON 文件

Export the result of cloud speech API to JSON file using Python

我正在尝试通过 Google 语音 API 将音频文件转换为印度语言的文本。 API returns "google.cloud.speech_v1.types.SpeechRecognitionAlternative" 类型的对象。我正在尝试将结果导出到 .json 文件。我对 python 很陌生。这是我在 python.

做的第一个项目
    import io
    import os
    import pickle

    # Imports the Google Cloud client library
    from google.cloud
    import speech
    from google.cloud.speech
    import enums
    from google.cloud.speech
    import types

    client = speech.SpeechClient()

    audio = types.RecognitionAudio(uri = "gs://storage-staples-canada/client-data/TapTapTap.wav")
    config = types.RecognitionConfig(
      encoding = enums.RecognitionConfig.AudioEncoding.LINEAR16,
      sample_rate_hertz = 16000,
      language_code = 'hi-IN',
      enable_word_time_offsets = True,
      speech_contexts = [speech.types.SpeechContext(phrases = ['एक जंगल था।', 'ख़ूब घना जंगल।', 'एक दिन झमाझम पानी बरसा।', 'थोड़ी देर बाद बारिश रुक गई। सारे जानवर बाहर निकले।', 'तभी आवाज़ आई टप टप टपक सब घबरा गए।', 'सबने सोचा यह कैसी आवाज़ है? सारे बड़े जानवर डर कर भाग गए।', 'चींटी ने कहा- चलो साथियो, हम टप- टप- टपक को ढूँढें। चूहा बोला- शाबाश चींटी बहन!', 'जुगनू बोला- मैं आगे रहूँगा। बिल्ली बोली- मैं साथ हूँ।', 'ख़रगोश ने कहा- मैं भी पीछे नहीं रहूँगा। सब टप- टप- टपक को ढूँढने चले।', 'फिर सबने देखा, बरसात का पानी पत्तों पर टपक रहा था', 'टप- टप- टपक।'])], )

    operation = client.long_running_recognize(config, audio)
    print('Waiting for operation to complete...')
    response = operation.result(timeout = 90)

    # Gets the time - offsets of each of the words in the audio

    for result in response.results:
      alternative = result.alternatives[0]# The first alternative is the most likely one
    for this portion.
    print('Transcript: {}'.format(result.alternatives[0].transcript))
    print('Confidence: {}'.format(result.alternatives[0].confidence))
    for word_info in alternative.words:
      word = word_info.word
    start_time = word_info.start_time
    end_time = word_info.end_time
    print('Word: {}, start_time: {}, end_time: {}'.format(
      word,
      start_time.seconds + start_time.nanos * 1e-9,
      end_time.seconds + end_time.nanos * 1e-9))

当我尝试将 API(存储在上面代码中的响应变量中)的结果转换为字典时。我收到的错误消息 "TypeError: 'SpeechRecognitionAlternative' object is not iterable"。你能帮我将结果转换并导出到 .json 文件吗?

对于此任务,您可以使用命令行工具 gcloud。例如

gcloud ml speech recognize-long-running \
  gs://storage-staples-canada/client-data/TapTapTap.wav \
  --language-code=hi-IN --encoding=linear16 --sample-rate=16000 \
  --include-word-time-offsets \
  --hints="एक जंगल था।,ख़ूब घना जंगल।"
  --format=json

您可以添加 --log-http 标志以查看 API 交互,这可以帮助您修复 python 代码。

我建议使用来自 google 的 protobuf 库的 protobuf↔json 转换器:

from google.protobuf.json_format import MessageToJson

# the below line is taken from the code above, which contains the google api results
response = operation.result(timeout = 90)
result_json = MessageToJson(response)

然后用json.dump写成result_json。请参阅 How do I write JSON data to a file?

from google.protobuf.json_format import MessageToDict
result_json = MessageToDict(response)
print(result_json)

import json
with open("result.json", "w") as jsonFile:
    json.dump(result_json, jsonFile, indent=4, sort_keys=True)