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