Dimostra come caricare i file immagine in Cloud Storage ed estrarre e tradurre il testo dalle immagini utilizzando l'API Vision e l'API Translation.
Per saperne di più
Per la documentazione dettagliata che include questo esempio di codice, consulta quanto segue:
Esempio di codice
Go
package ocr
import (
"context"
"encoding/json"
"fmt"
"log"
"cloud.google.com/go/pubsub"
"cloud.google.com/go/translate"
)
// TranslateText is executed when a message is published to the Cloud Pub/Sub
// topic specified by the TRANSLATE_TOPIC environment variable, and translates
// the text using the Google Translate API.
func TranslateText(ctx context.Context, event PubSubMessage) error {
if err := setup(ctx); err != nil {
return fmt.Errorf("setup: %v", err)
}
if event.Data == nil {
return fmt.Errorf("empty data")
}
var message ocrMessage
if err := json.Unmarshal(event.Data, &message); err != nil {
return fmt.Errorf("json.Unmarshal: %v", err)
}
log.Printf("Translating text into %s.", message.Lang.String())
opts := translate.Options{
Source: message.SrcLang,
}
translateResponse, err := translateClient.Translate(ctx, []string{message.Text}, message.Lang, &opts)
if err != nil {
return fmt.Errorf("Translate: %v", err)
}
if len(translateResponse) == 0 {
return fmt.Errorf("Empty Translate response")
}
translatedText := translateResponse[0]
messageData, err := json.Marshal(ocrMessage{
Text: translatedText.Text,
FileName: message.FileName,
Lang: message.Lang,
SrcLang: message.SrcLang,
})
if err != nil {
return fmt.Errorf("json.Marshal: %v", err)
}
topic := pubsubClient.Topic(resultTopic)
ok, err := topic.Exists(ctx)
if err != nil {
return fmt.Errorf("Exists: %v", err)
}
if !ok {
topic, err = pubsubClient.CreateTopic(ctx, resultTopic)
if err != nil {
return fmt.Errorf("CreateTopic: %v", err)
}
}
msg := &pubsub.Message{
Data: messageData,
}
if _, err = topic.Publish(ctx, msg).Get(ctx); err != nil {
return fmt.Errorf("Get: %v", err)
}
log.Printf("Sent translation: %q", translatedText.Text)
return nil
}
Java
import com.google.cloud.functions.BackgroundFunction;
import com.google.cloud.functions.Context;
import com.google.cloud.pubsub.v1.Publisher;
import com.google.cloud.translate.v3.LocationName;
import com.google.cloud.translate.v3.TranslateTextRequest;
import com.google.cloud.translate.v3.TranslateTextResponse;
import com.google.cloud.translate.v3.TranslationServiceClient;
import com.google.events.cloud.pubsub.v1.Message;
import com.google.protobuf.ByteString;
import com.google.pubsub.v1.ProjectTopicName;
import com.google.pubsub.v1.PubsubMessage;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class OcrTranslateText implements BackgroundFunction<Message> {
private static final Logger logger = Logger.getLogger(OcrTranslateText.class.getName());
// TODO<developer> set these environment variables
private static final String PROJECT_ID = getenv("GCP_PROJECT");
private static final String RESULTS_TOPIC_NAME = getenv("RESULT_TOPIC");
private static final String LOCATION_NAME = LocationName.of(PROJECT_ID, "global").toString();
private Publisher publisher;
public OcrTranslateText() throws IOException {
publisher = Publisher.newBuilder(
ProjectTopicName.of(PROJECT_ID, RESULTS_TOPIC_NAME)).build();
}
@Override
public void accept(Message message, Context context) {
OcrTranslateApiMessage ocrMessage = OcrTranslateApiMessage.fromPubsubData(
message.getData().getBytes(StandardCharsets.UTF_8));
String targetLang = ocrMessage.getLang();
logger.info("Translating text into " + targetLang);
// Translate text to target language
String text = ocrMessage.getText();
TranslateTextRequest request =
TranslateTextRequest.newBuilder()
.setParent(LOCATION_NAME)
.setMimeType("text/plain")
.setTargetLanguageCode(targetLang)
.addContents(text)
.build();
TranslateTextResponse response;
try (TranslationServiceClient client = TranslationServiceClient.create()) {
response = client.translateText(request);
} catch (IOException e) {
// Log error (since IOException cannot be thrown by a function)
logger.log(Level.SEVERE, "Error translating text: " + e.getMessage(), e);
return;
}
if (response.getTranslationsCount() == 0) {
return;
}
String translatedText = response.getTranslations(0).getTranslatedText();
logger.info("Translated text: " + translatedText);
// Send translated text to (subsequent) Pub/Sub topic
String filename = ocrMessage.getFilename();
OcrTranslateApiMessage translateMessage = new OcrTranslateApiMessage(
translatedText, filename, targetLang);
try {
ByteString byteStr = ByteString.copyFrom(translateMessage.toPubsubData());
PubsubMessage pubsubApiMessage = PubsubMessage.newBuilder().setData(byteStr).build();
publisher.publish(pubsubApiMessage).get();
logger.info("Text translated to " + targetLang);
} catch (InterruptedException | ExecutionException e) {
// Log error (since these exception types cannot be thrown by a function)
logger.log(Level.SEVERE, "Error publishing translation save request: " + e.getMessage(), e);
}
}
// Avoid ungraceful deployment failures due to unset environment variables.
// If you get this warning you should redeploy with the variable set.
private static String getenv(String name) {
String value = System.getenv(name);
if (value == null) {
logger.warning("Environment variable " + name + " was not set");
value = "MISSING";
}
return value;
}
}
Node.js
/**
* This function is exported by index.js, and is executed when
* a message is published to the Cloud Pub/Sub topic specified
* by the TRANSLATE_TOPIC environment variable. The function
* translates text using the Google Translate API.
*
* @param {object} event The Cloud Pub/Sub Message object.
* @param {string} {messageObject}.data The "data" property of the Cloud Pub/Sub
* Message. This property will be a base64-encoded string that you must decode.
*/
exports.translateText = async event => {
const pubsubData = event.data;
const jsonStr = Buffer.from(pubsubData, 'base64').toString();
const {text, filename, lang} = JSON.parse(jsonStr);
if (!text) {
throw new Error(
'Text not provided. Make sure you have a "text" property in your request'
);
}
if (!filename) {
throw new Error(
'Filename not provided. Make sure you have a "filename" property in your request'
);
}
if (!lang) {
throw new Error(
'Language not provided. Make sure you have a "lang" property in your request'
);
}
console.log(`Translating text into ${lang}`);
const [translation] = await translate.translate(text, lang);
console.log('Translated text:', translation);
const messageData = {
text: translation,
filename: filename,
lang: lang,
};
await publishResult(process.env.RESULT_TOPIC, messageData);
console.log(`Text translated to ${lang}`);
};
Python
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 = os.environ["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()
Passaggi successivi
Per cercare e filtrare esempi di codice per altri prodotti Google Cloud, vedi il browser di esempio Google Cloud.