Adding a New Service

This page offers an overview about the (detailed) steps of how to integrate a service into the SIC Framework. Become familiar with what a service could (not) be by checking out https://socialrobotics.atlassian.net/wiki/spaces/CBSR/pages/2070183939 . The code for all the existing services can be found at https://bitbucket.org/socialroboticshub/processing/src/master/.

Summary How to Add a Service to the SIC Framework

  1. create a new folder in https://bitbucket.org/socialroboticshub/processing/src/master/ with the name of the service

  2. copy the certificate file from any of the other services' folders into the service’s folder

  3. copy any additional files that the services may need into the service’s folder

  4. create a factory file inheriting from the SICfactory in the service’s folder, and override the superclass’s methods

  5. create a service file inheriting from SICservice in the service’s folder, and override the superclass’s methods

  6. update the file in the root folder with the new service files

  7. deploy the new service to the folder by running the deploy_to_docker.sh file

  8. update the file in the docker folder with the new service

  9. update the file in the docker folder with the new service’s dependencies

  10. update the topics in the constructor of the Abstract Connector from the folder with the name of the new service

  11. update the device listeners in enable_service in the Abstract Connector with the service

  12. update the listened to channels in __listen in the Abstract Connector with the service

  13. create the corresponding event handler method for the service in the Abstract Connector

  14. create the corresponding event handler method for the service in the Basic Connector

  15. use the service in a new file

 

The detailed explanation of these steps with a sentiment analysis example can be found below:

Detailed How to Add a (Sentiment) Service to the SIC Framework

There are two shared libraries that handle a lot of the common logic that is needed to interact with our framework: one for Python-based integrations and one for Java-based integrations (using Maven). In order to allow users to run services without worrying about compatibility and installations, Docker Compose is used.

If a service is not simply an alternative to an existing service, adding a new service will also require updates to the connectors (EIS and Python) in order to be fully integrated.

  1. create a new folder in with the name of the service. sentiment_analysis ( ) will be used as the example folder and service in this case

  2. copy the certificate file from any of the other services' folders into the sentimentfolder

  3. copy the into the sentiment folder

  4. create a file in the sentiment folder

from os import getcwd from sic.factory import SICfactory from nltk import download from nltk.data import path from sentiment_service import SentimentAnalysisService class SentimentAnalysisFactory(SICfactory): def __init__(self): super(SentimentAnalysisFactory, self).__init__() def get_connection_channel(self): return 'sentiment_analysis' def create_service(self, connect, identifier, disconnect): return SentimentAnalysisService(connect, identifier, disconnect) if __name__ == '__main__': cwd = getcwd() download('punkt', download_dir=cwd) download('omw-1.4', download_dir=cwd) download('averaged_perceptron_tagger', download_dir=cwd) download('wordnet', download_dir=cwd) path.append(cwd) sentiment_analysis_factory = SentimentAnalysisFactory() sentiment_analysis_factory.run()

5. create a file in the sentiment folder

""" This file shows an example of a sentiment service that uses the text_transcript channel result from the Dialogflow speech-to-text to get the the type of sentiment """ from pickle import load from re import sub from string import punctuation from sic.service import SICservice from nltk.stem.wordnet import WordNetLemmatizer from nltk.tag import pos_tag from nltk.tokenize import word_tokenize class SentimentAnalysisService(SICservice): def __init__(self, connect, identifier, disconnect): super(SentimentAnalysisService, self).__init__(connect, identifier, disconnect) with open('classifier.pickle', 'rb') as pickle: self.classifier = load(pickle) self.lemmatizer = WordNetLemmatizer() def get_device_types(self): return ['mic'] def get_channel_action_mapping(self): return {self.get_full_channel('text_transcript'): self.execute} def execute(self, message): sentence = message['data'].decode() tokens = self.remove_noise(word_tokenize(sentence)) sentiment = self.classifier.classify(dict([token, True] for token in tokens)) print(sentiment) self.publish('text_sentiment', sentiment) ...

6. update the file in the root folder with the new service files

... echo Deploying sentiment_analysis... cd ../audio_sentiment cp -f {cert.pem,classifier.pickle,*.py} ../../docker/sic/sentiment # extra files should also be inclduded here ...

7. deploy the new service to the folder by running the deploy_to_docker.sh file

8. update the file in the docker folder with the new service

9. update the file in the docker folder with the new service’s dependencies

10. update the topics in the constructor of the Abstract Connector abstract_connector.py from the folder with the name of the new service

topics = [..., 'text_sentiment']

11. update the corresponding list of devices listeners in enable_service in abstract_connector.py with my_service

 

12. update the channels in __listen in abstract_connector.py with my_service

13. create the corresponding event handler method on_my_service in abstract_connector.py

14. create the corresponding inherited event handler method on_my_service in basic_connector.py

15. use the new service by creating a new file sentiment_example.py, overriding the on_text_sentiment method and running it