· 6 years ago · Jan 12, 2020, 09:34 AM
1import os, base64, json, requests
2from flask import Flask, render_template, request
3
4# Load system variables with dotenv
5from dotenv import load_dotenv
6load_dotenv()
7
8# Load keys
9COGSVCS_CLIENTURL = os.environ["COGSVCS_CLIENTURL"]
10COGSVCS_KEY = os.environ["COGSVCS_KEY"]
11COGSVCS_REGION = 'northcentralus'
12
13# Create vision_client
14from msrest.authentication import CognitiveServicesCredentials
15from azure.cognitiveservices.vision.computervision import ComputerVisionClient
16from azure.cognitiveservices.vision.computervision.models import ComputerVisionErrorException
17
18vision_credentials = CognitiveServicesCredentials(COGSVCS_KEY)
19vision_client = ComputerVisionClient(COGSVCS_CLIENTURL, vision_credentials)
20
21# Create face_client
22
23# Create the application
24app = Flask(__name__)
25
26@app.route("/", methods=["GET"])
27def index():
28 return render_template("index.html")
29
30@app.route("/translate", methods=["GET", "POST"])
31def translate():
32 # Load image or placeholder
33 image = get_image(request)
34
35 # Set the default for language translation
36 target_language = "en"
37 if request.form and "target_language" in request.form:
38 target_language = request.form["target_language"]
39
40 # If it"s a GET, just return the form
41 if request.method == "GET":
42 return render_template("translate.html", image_uri=image.uri, target_language=target_language)
43
44 # Create a placeholder for messages
45 messages = []
46
47 # TODO: Add code to retrieve text from picture
48 messages = extract_text_from_image(image.blob, vision_client)
49
50 # TODO: Add code to translate text
51 messages = translate_text(messages, target_language, COGSVCS_KEY, COGSVCS_REGION)
52
53 return render_template("translate.html", image_uri=image.uri, target_language=target_language, messages=messages)
54
55@app.route("/train", methods=["GET", "POST"])
56def train():
57 # Load image or placeholder
58 image = get_image(request)
59
60 # If it"s a GET, just return the form
61 if request.method == "GET":
62 return render_template("train.html", image_uri=image.uri)
63
64 # Retrieve name from form
65 name = ""
66 if "name" in request.form:
67 name = request.form["name"]
68
69 # Placeholder for messages
70 messages = []
71
72 # TODO: Add code to create or update person
73
74
75 if not messages:
76 messages.append("I don't recognize anyone")
77
78 return render_template("train.html", messages=messages, image_uri=image.uri)
79
80@app.route("/detect", methods=["GET", "POST"])
81def detect():
82 # Load image or placeholder
83 image = get_image(request)
84
85 # If it"s a GET, just return the form
86 if request.method == "GET":
87 return render_template("detect.html", image_uri=image.uri)
88
89 # Placeholder for message
90 messages = []
91
92 # TODO: Add code to detect people in picture
93
94 return render_template("detect.html", messages=messages, image_uri=image.uri)
95
96def get_image(request):
97 # Helper class
98 from image import Image
99 if request.files:
100 return Image(request.files["file"])
101 else:
102 return Image()
103
104def extract_text_from_image(image, client):
105 try:
106 result = client.recognize_printed_text_in_stream(image=image)
107
108 lines=[]
109 if len(result.regions) == 0:
110 lines.append("Photo contains no text to translate")
111
112 else:
113 for line in result.regions[0].lines:
114 text = " ".join([word.text for word in line.words])
115 lines.append(text)
116
117 return lines
118
119 except ComputerVisionErrorException as e:
120 return ["Computer Vision API error: " + e.message]
121
122 except:
123 return ["Error calling the Computer Vision API"]
124
125def translate_text(lines, target_language, key, region):
126 uri = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=" + target_language
127
128 headers = {
129 'Ocp-Apim-Subscription-Key': key,
130 'Ocp-Apim-Subscription-Region': region,
131 'Content-type': 'application/json'
132 }
133
134 input=[]
135
136 for line in lines:
137 input.append({ "text": line })
138
139 try:
140 response = requests.post(uri, headers=headers, json=input)
141 response.raise_for_status() # Raise exception if call failed
142 results = response.json()
143
144 translated_lines = []
145
146 for result in results:
147 for translated_line in result["translations"]:
148 translated_lines.append(translated_line["text"])
149
150 return translated_lines
151
152 except requests.exceptions.HTTPError as e:
153 return ["Error calling the Translator Text API: " + e.strerror]
154
155 except Exception as e:
156 return ["Error calling the Translator Text API"]