-
Notifications
You must be signed in to change notification settings - Fork 8
/
final.py
173 lines (145 loc) · 6.29 KB
/
final.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# Dependencies are imported here.
# Check out ----> https://cloud.google.com/python/docs/ for instruction to install the G-cloud dependencies.
import RPi.GPIO as GPIO
import time,os,pygame,datetime
from picamera import PiCamera
from google.cloud import vision
from google.cloud.vision import types
from google.cloud import texttospeech
# Edit the "YOUR_GCLOUD_JSON_CREDENTIALS" with the path to your credential file.
# Credentials can be found here ----> https://console.cloud.google.com
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'YOUR_GCLOUD_JSON_CREDENTIALS'
# client ---> Object initiated to Vision API class.
# camera ---> Object intitiated to PiCamera Class.
client = vision.ImageAnnotatorClient()
camera = PiCamera()
# Set the camera resolution to 512x512.
camera.resolution = (512,512)
# Set the GPIO pin configuration of RPi3 to BOARD mode.
# GPIO 16 ---> Triggers Camera capture.
# GPIO 18 ---> Pause/Play the audio.
# GPIO 37 ---> LDR input.
# GPIO 35,33,31,29 are connected to LEDs.
GPIO.setmode(GPIO.BOARD)
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(37,GPIO.IN) # ldr INPUT
GPIO.setup(35,GPIO.OUT)
GPIO.setup(33,GPIO.OUT)
GPIO.setup(31,GPIO.OUT)
GPIO.setup(29,GPIO.OUT)
#Initialize the pygame module for playing the audio files.
#pygame.init() ---> Uncomment this line in case there is problem with the sound playing part.
pygame.mixer.init()
print("Press Start button to read out the page")
# flag ---> Status flag to indicate the current status of audio file i.e. Playing/Paused.
# light_on ---> Status flag to check the current status of the LEDs i.e. ON/OFF.
flag=0
light_on=0
file_playing=0
# Helper function to perform Text-to-Speech conversion using Google Text to SPeech API.
# text ---> The text to be converted to audio.
# audioname ---> The name of the output audio file.
def synthesize_text(text,audioname):
# client ---> Initialised to TextToSpeech API Class.
client = texttospeech.TextToSpeechClient()
input_text = texttospeech.types.SynthesisInput(text=text)
# Note: the voice can also be specified by name.
# Names of voices can be retrieved with client.list_voices().
voice = texttospeech.types.VoiceSelectionParams(
language_code='en-US',
ssml_gender=texttospeech.enums.SsmlVoiceGender.FEMALE)
# audion_config = configuration for the output audio file. Supports other formats such as WAV, AVI etc.
audio_config = texttospeech.types.AudioConfig(
audio_encoding=texttospeech.enums.AudioEncoding.MP3)
# response ---> Receives API response for the input text.
response = client.synthesize_speech(input_text, voice, audio_config)
# The response's audio_content is in binary format. The audio content is written into the output file.
with open(audioname, 'wb') as out:
out.write(response.audio_content)
print('Audio content written to file {}'.format(audioname))
# Detect Capture button state.
# Capture new image if the camera capture button is pressed.
while True:
try:
# capture_button ---> Button input to capture new image.
# pause_button ---> Button input to pause/play audio file.
capture_button = GPIO.input(16)
pause_button = GPIO.input(18)
# capture_button=0 ---> when it is pressed.
if capture_button == False:
time.sleep(1)
flag=0
print('Capturing new image...')
# image_name ---> name of the captured image.
image_name = "Book-"+datetime.datetime.now().strftime("%H-%M-%S")+".jpg"
# 2 second sleep to give sufficient time for the camera to initialize.
camera.start_preview()
time.sleep(2)
camera.capture(image_name)
print("Image clicked . . .")
# content ---> Image contents in binary.
with open(image_name, 'rb') as image_file:
content = image_file.read()
print("Sending Image to OCR . . ")
# Send the binary to OCR API for text extraction.
image = types.Image(content=content)
response = client.document_text_detection(image=image)
labels = response.full_text_annotation
# Capitalize every word's first letter.
# Add an additional identifier at the end, to signify end of file.
s=""
for i in labels.text.split():
s+=i+" "
t=""
for i in s.split():
temp=i[0].upper()
temp2=i[1:].lower()
t+=temp+temp2+" "
print("\n"+t)
t+=". ,End Of Page Mr. X"
print("Converting your text to sound . . .")
# audioname ---> stores the name of the audio file.
audioname="Book-"+datetime.datetime.now().strftime("%H-%M-%S")+".mp3"
synthesize_text(t,audioname)
print("Starting audio. . .")
print("Press pause button to Pause/Resume")
# Initialize the mixer to start playing the audio file.
pygame.mixer.music.load(audioname)
pygame.mixer.music.play()
time.sleep(4)
file_playing=1
#os.system("vlc {}".format(audioname))
# Check for pause button condition.
# flag=0 ---> audio playing.
# flag=1 ---> audio paused.
if (pause_button == False):
time.sleep(1)
if flag==0:
pygame.mixer.music.pause()
flag=1
print("Paused. . . ")
elif flag==1:
pygame.mixer.music.unpause()
flag=0
print("Resumed. . . ")
# LDR ---> pin 37. Glow LEDs in low lighting condition.
if GPIO.input(37) != False and light_on==0:
time.sleep(0.2)
GPIO.output(35,1)
GPIO.output(33,1)
GPIO.output(31,1)
GPIO.output(29,1)
light_on=1
# Switch off LEDs.
if GPIO.input(37) != True and light_on==1:
time.sleep(0.2)
GPIO.output(35,0)
GPIO.output(33,0)
GPIO.output(31,0)
GPIO.output(29,0)
light_on=0
except Exception as e:
print(e)
GPIO.cleanup()
break