DEV Community

Cover image for AWS Polly to read current weather and news
seboo1995
seboo1995

Posted on

AWS Polly to read current weather and news

Introduction

We all know that Cloud technologies and Machine Learning are extremely advancing, therefore, we need to utilize this.
AWS(Amazon Web Services) has a service called Polly reads a text, now this service uses Machine Learning in the background, but that is not the scope of this post.

A bit about the project

I extracted weather data by using the OWM(Open Weather Map) API for two cities in Hungary: Budapest and Miskolc.
My goal with this project was that everyone has a fast lifestyle, that we do not have the time to check the weather. SO that is why I created this so, for example, you can do your work while listening the weather data. This also can be enriched with news data, so I tried to use news API and enrich this application. Polly will read the top-news headlines.
The code was written in R (using R studio) and below I will show my code.

Importing libraries and setting global variables

Here I am using the owmr and tidyverse libraries. The owmr library is the interface that R has with OWM. I saved my API key somewhere safe in my directory and externally load it.

#     SETTING THE ENVIRONMENT
#-----------------------------------------
library(owmr)
library(tidyverse)
#I will get my API key that is stored in my project directory,
#and make it global
#If you want to use this code, 
#then name the file API_KEY and
#put the API key in the file.
API_KEY <- read_file("API_KEY")
Sys.setenv(OWM_API_KEY = API_KEY)
Enter fullscreen mode Exit fullscreen mode

Specifying the location that I want to get weather data

Here I am trying to get the weather data with the API. In order to do that I need to get the id of the cities, that are defined by the API.
So the tibble owm_cities contains the id and coordinates of the
cities.

#           ASSIGNING CITIES 
#-----------------------------------------
#The city that I am interested in is Budapest and Deprecen(Hungarian Cities)
desired_city <- c("Budapest","Miskolc")
#In the package there is a tibble with the cities"
head(owm_cities)
# I am getting the id of the cities
id_of_cities <- owm_cities %>%
  filter(nm %in% desired_city) %>%
  select(id,nm)
Enter fullscreen mode Exit fullscreen mode

Getting the weather data

Here I am getting the data from the API, but the data is in format that is hard to work on, however owmr package has a nice function called owmr_as_tibble that transforms the API response from a complicated object to a tibble.

 #             GETTING CURRENT WEATHER DATA
# -------------------------------------------------
#Getting the current weather data for this cities

response_from_API <- get_current_for_group(id_of_cities$id)

class(response_from_API)
#Because the format that response_from_API has it is not formated well enough
#I will use a function that turns the list and owmr_group in tibble
response_from_API
response_tibble <- owmr_as_tibble(response_from_API)
Enter fullscreen mode Exit fullscreen mode

Here I am trying to get the forecast

#       FORECAST WEATHER DATA 
# -------------------------------------------------
#getting the forecast
forecast_Budapest <- get_forecast("Budapest")
forecast_Miskolc <- get_forecast("Miskolc")
#making them a tibble
forecast_Budapest <- owmr_as_tibble(forecast_Budapest)
forecast_Budapest
forecast_Miskolc <- owmr_as_tibble(forecast_Miskolc)

#Well I am intereste in getting the first 9 hours of the data, or the first 3 hours to
# the third  3 hour interval.
forecast_Budapest <-forecast_Budapest %>% select(weather_main, temp,humidity,weather_description,wind_speed)
forecast_Miskolc <-forecast_Miskolc %>% select(weather_main, temp,humidity,weather_description,wind_speed)
Enter fullscreen mode Exit fullscreen mode

Saving data to AWS S3

Because data is so important, I will try to store it in S3 as well, just like back-up.


#         SAVING FILES TO UPLOAD TO S3         
#--------------------------------------
#For Budapest
write_csv(forecast_Budapest,path =  "Budapest_forecast.csv")
#For Miskolc
write_csv(forecast_Miskolc,path  = "Miskolc_forecast.csv")



# GETTING READY TO  UPLOAD THE DATA IN S3
#--------------------------------------
#getting the keys
keyTable <- read.csv("credentials.csv", header = T)
AWS_ACCESS_KEY_ID <- as.character(keyTable$Access.key.ID)
AWS_SECRET_ACCESS_KEY <- as.character(keyTable$Secret.access.key)

#making the 
  Sys.setenv("AWS_ACCESS_KEY_ID" = "AWS_ACCESS_KEY_ID",
           "AWS_SECRET_ACCESS_KEY" = "AWS_SECRET_ACCESS_KEY",
           "AWS_DEFAULT_REGION" = "eu-west-1") 
keyTable
# UPLOADING DATA TO S3
#--------------------------------------
#importing library
library(aws.s3)

#name of my bucket
bucket_name <- "sebair-selmani-1803425" 
#putting the forecast-data.Rdata in the bucket
put_object("forecast-data.RData", bucket = bucket_name)
#putting the current data
put_object("current-data.RData", bucket = bucket_name)
Enter fullscreen mode Exit fullscreen mode

The interesting part where I use Polly

# USING POLLY TO READ DATA
#--------------------------------------

#READING THE CURRENT WEATHER
library(aws.polly)
library(aws.signature)
response_tibble$
welcome<- synthesize("Welcome to my app user", voice = "Joanna")
# the temp is in kelvins

current_weather_Budapest <- synthesize(paste0("The current temprature in",as.character(desired_city[1]),"is", 
                                     as.character((response_tibble$temp[1])-273.15),"and the humidity is"
                                     ,as.character(response_tibble$humidity[1],"and the weather description",
                                                   response_tibble$weather_description[1],response_tibble$weather_main[1])),voice = "Ivy")

current_weather_Miskolc <- synthesize(paste0("The current temprature in",as.character(desired_city[2]),"is", 
                                              as.character((response_tibble$temp[2])-273.15),"and the humidity is"
                                              ,as.character(response_tibble$humidity[2],"and the weather description",
                                                            response_tibble$weather_description[2],response_tibble$weather_main[2])),voice = "Ivy")
#READING THE FORECAST FOR THE NEXT 3 HOURS, BUT I HAVE DATA FOR THE NEXT 9 HOURS
forecast_weather_Budapest <- synthesize(paste0("The weather in the next 3 hours in", 
                                               desirec_city[1],
                                               " The tempature will be ",forecast_Budapest$temp[1],
                                               "The humidity will be",forecast_Budapest$humidity[1], 
                                               "and the overall description will be"
                                               ,forecast_Budapest$weather_description),voice = "Ivy")


forecast_weather_Miskolc <- synthesize(paste0("The weather in the next 3 hours in", 
                                               desirec_city[2],
                                               " The tempature will be ",forecast_Miskolc$temp[1],
                                               "The humidity will be",forecast_Miskolc$humidity[1], 
                                               "and the overall description will be"
                                               ,forecast_Miskolc$weather_description),voice = "Ivy")

# PLAYING WITH AUDACIOUS PLAYER
library("tuneR")
setWavPlayer("audacious")
play(current_weather_Budapest)
play(current_weather_Miskolc)
play(forecast_weather_Budapest)
play(forecast_weather_Miskolc)
Enter fullscreen mode Exit fullscreen mode

Getting news from Google news API and playing only the headlines

# GETTING NEWS DATA FROM GOOGLE NEWS API
#--------------------------------------
library(rvest)
library(jsonlite)

#my google news api key
API_KEY_NEWS <- read_file("API_NEWS")


# for getting the top news
url <- paste0("https://newsapi.org/v2/top-headlines?country=hu&apiKey=",API_KEY_NEWS)




data <- fromJSON(url_fake)
data$articles$title
#READING ONLY THE HEADLINES

lapply(data$articles$title
 , function(inp){
   title <- synthesize(inp,voice = "Ivy")
   play(title)

 })

goodbye <- synthesize("It was a pleasure to work with you. I wish you a happy day",voice = "Ivy")
play(goodbye)

Enter fullscreen mode Exit fullscreen mode

Well we came to the end of the project. This is only a mini project that can be developed to a full mobile application, but I will leave that for the future.

Top comments (0)