Google cloud platform 将其他语言输出到云发布/订阅主题

Google cloud platform 将其他语言输出到云发布/订阅主题,google-cloud-platform,google-cloud-functions,google-translate,google-cloud-pubsub,vision-api,Google Cloud Platform,Google Cloud Functions,Google Translate,Google Cloud Pubsub,Vision Api,我正在使用谷歌云函数结合他们的Vision API和Translate API从图像中提取文本,然后将提取的文本翻译成各种语言。输出被传递到发布/订阅主题,然后存储在云存储桶中。所有组件似乎都工作正常,除了我的输出没有针对语言进行正确编码,所以我得到的字符串是“PÃ、téOeufs Mimosa”,而不是“P–té–Oeufs Mimosa” 以下是我正在使用的相关代码: # [START functions_ocr_detect] def detect_text(bucket, filena

我正在使用谷歌云函数结合他们的Vision API和Translate API从图像中提取文本,然后将提取的文本翻译成各种语言。输出被传递到发布/订阅主题,然后存储在云存储桶中。所有组件似乎都工作正常,除了我的输出没有针对语言进行正确编码,所以我得到的字符串是“PÃ、téOeufs Mimosa”,而不是“P–té–Oeufs Mimosa”

以下是我正在使用的相关代码:

# [START functions_ocr_detect]
def detect_text(bucket, filename):
    print('Looking for text in image {}'.format(filename))

    futures = []

    text_detection_response = vision_client.text_detection({
        'source': {'image_uri': 'gs://{}/{}'.format(bucket, filename)}
    })
    annotations = text_detection_response.text_annotations
    if len(annotations) > 0:
        text = annotations[0].description
    else:
        text = ''
    print('Extracted text {} from image ({} chars).'.format(text, len(text)))

    detect_language_response = translate_client.detect_language(text)
    src_lang = detect_language_response['language']
    print('Detected language {} for text {}.'.format(src_lang, text))

    # Submit a message to the bus for each target language
    for target_lang in TO_LANG:
        topic_name = TRANSLATE_TOPIC
        if src_lang == target_lang or src_lang == 'und':
            topic_name = RESULT_TOPIC
        message = {
            'text': text,
            'filename': filename,
            'lang': target_lang,
            'src_lang': src_lang
        }
        message_data = json.dumps(message).encode('utf-8')
        topic_path = publisher.topic_path(project_id, topic_name)
        future = publisher.publish(topic_path, data=message_data)
        futures.append(future)
    for future in futures:
        future.result()
# [END functions_ocr_detect]


# [START message_validatation_helper]
def validate_message(message, param):
    var = message.get(param)
    if not var:
        raise ValueError('{} is not provided. Make sure you have \
                          property {} in the request'.format(param, param))
    return var
# [END message_validatation_helper]


# [START functions_ocr_process]
def process_image(file, context):
    """Cloud Function triggered by Cloud Storage when a file is changed.
    Args:
        file (dict): Metadata of the changed file, provided by the triggering
                                 Cloud Storage event.
        context (google.cloud.functions.Context): Metadata of triggering event.
    Returns:
        None; the output is written to stdout and Stackdriver Logging
    """
    bucket = validate_message(file, 'bucket')
    name = validate_message(file, 'name')

    detect_text(bucket, name)

    print('File {} processed.'.format(file['name']))
# [END functions_ocr_process]


# [START functions_ocr_translate]
def translate_text(event, context):
    if event.get('data'):
        message_data = base64.b64decode(event['data']).decode('utf-8')
        message = json.loads(message_data)
    else:
        raise ValueError('Data sector is missing in the Pub/Sub message.')

    text = validate_message(message, 'text')
    filename = validate_message(message, 'filename')
    target_lang = validate_message(message, 'lang')
    src_lang = validate_message(message, 'src_lang')

    print('Translating text into {}.'.format(target_lang))
    translated_text = translate_client.translate(text,
                                                 target_language=target_lang,
                                                 source_language=src_lang)
    topic_name = RESULT_TOPIC']
    message = {
        'text': translated_text['translatedText'],
        'filename': filename,
        'lang': target_lang,
    }
    message_data = json.dumps(message).encode('utf-8')
    topic_path = publisher.topic_path(project_id, topic_name)
    future = publisher.publish(topic_path, data=message_data)
    future.result()
# [END functions_ocr_translate]


# [START functions_ocr_save]
def save_result(event, context):
    if event.get('data'):
        message_data = base64.b64decode(event['data']).decode('utf-8')
        message = json.loads(message_data)
    else:
        raise ValueError('Data sector is missing in the Pub/Sub message.')

    text = validate_message(message, 'text')
    filename = validate_message(message, 'filename')
    lang = validate_message(message, 'lang')

    print('Received request to save file {}.'.format(filename))

    bucket_name = RESULT_BUCKET
    result_filename = '{}_{}.txt'.format(filename, lang)
    bucket = storage_client.get_bucket(bucket_name)
    blob = bucket.blob(result_filename)

    print('Saving result to {} in bucket {}.'.format(result_filename, bucket_name))
    blob.upload_from_string(text)

    print('File saved.')
# [END functions_ocr_save]


A具有
content\u编码
content\u类型
content\u语言
标题。。。可能应该是:
content_type='text/plain';charset='utf-8',content\u encoding='utf-8',content\u language='fr'

这是一个编码问题。你的产出是什么/在哪里?您是如何读取输出的?在某些地方,您将字符串处理为ASCII而不是UTF-8。在源代码中提供一些调试输出将帮助我们了解问题。它输出到云发布/子主题,然后再输出到云存储桶。请参阅translate_text()和save_result()函数。我在任何可能的地方都将编码设置为UTF-8,即
message\u data=json.dumps(message.encode('UTF-8')
,但不知何故它转换为ASCII。我怀疑它可能在最终的save_result()中,它使用blob()函数将翻译存储在云存储中。不知道如何在那里添加编码。除了可能
var=message.get(param)
之外,我没有看到任何明显的东西。在处理/转换字符串的每个步骤中添加调试代码(记录消息)。这将显示字符串转换为Ascii的位置。注意:我假设您使用的是Python 3。这是一个很大的不同。是的,Python3.7。我会看看是否能找出它发生的地方。谢谢,Martin-根据你的建议,我能够将以下内容添加到我的save_results()函数中,并得到我想要的输出:``theHeader=f“content\u type='text/plain';charset='utf-8';content\u lang='{lang}'blob.upload\u from_string(text,theHeader)```