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 Services - Restructured . The code for all the existing services can be found at https://bitbucket.org/socialroboticshub/processing/src/master/. Creating a new service can be done as follows, and then included in the repository by opening a Pull Request:
Summarised Steps
...
Summary How to Add a Service to the SIC Framework
create a new folder in https://bitbucket.org/socialroboticshub/processing/src/master/ with the name of the service
copy the certificate file https://bitbucket.org/socialroboticshub/docker/src/master/cbsrsic/beamforming/cert.pem from any of the other services' folders into the service’s folder
copy any additional files that the services may need into the service’s folder
create a factory file inheriting from the
CBSRFactory
SICfactory
in the service’s folder, and override the superclass’s methodscreate a service file inheriting from
CBSRService
SICservice
in the service’s folder, and override the superclass’s methodsupdate the https://bitbucket.org/socialroboticshub/processing/src/master/deploy_to_docker.sh file in the root folder with the new service files
deploy the new service to the https://bitbucket.org/socialroboticshub/docker/src/master/ folder by running the
deploy_to_docker.sh
fileupdate the https://bitbucket.org/socialroboticshub/docker/src/master/docker-compose.yml file in the
docker
folder with the new serviceupdate the https://bitbucket.org/socialroboticshub/docker/src/master/Dockerfile.python3 file in the
docker
folder with the new service’s dependenciesupdate the topics in the constructor of the Abstract Connector from the https://bitbucket.org/socialroboticshub/connectors/src/master/python/social_interaction_cloud/ folder with the name of the new service
update the device listeners in
enable_service
in the Abstract Connector with the serviceupdate the listened to channels in
__listen
in the Abstract Connector with the servicecreate the corresponding event handler method for the service in the Abstract Connector
create the corresponding event handler method for the service in the Basic Connector
use the service in a new file
...
The detailed explanation of these steps with a sentiment analysis example can be found below:
...
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.
create a new folder in https://bitbucket.org/socialroboticshub/processing/src/master/ with the name of the service.
sentiment_analysis
(https://bitbucket.org/socialroboticshub/docker/src/master/cbsrsic/sentiment/ ) will be used as the example folder and service in this casecopy the certificate file https://bitbucket.org/socialroboticshub/docker/src/master/cbsrsic/beamforming/cert.pem from any of the other services' folders into the
sentiment
foldercopy the https://bitbucket.org/socialroboticshub/docker/src/master/cbsrsic/sentiment/classifier.pickle into the
sentiment
foldercreate a https://bitbucket.org/socialroboticshub/docker/src/master/cbsrsic/sentiment/sentiment_factory.py file in the
sentiment
folder
Code Block | ||||
---|---|---|---|---|
| ||||
from os import getcwd from cbsrsic.factory import CBSRfactorySICfactory from nltk import download from nltk.data import path from sentiment_service import SentimentAnalysisService class SentimentAnalysisFactory(CBSRfactorySICfactory): 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 https://bitbucket.org/socialroboticshub/docker/src/master/cbsrsic/sentiment/sentiment_service.py file in the sentiment
folder
Code Block | ||||
---|---|---|---|---|
| ||||
""" 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 cbsrsic.service import CBSRserviceSICservice from nltk.stem.wordnet import WordNetLemmatizer from nltk.tag import pos_tag from nltk.tokenize import word_tokenize class SentimentAnalysisService(CBSRserviceSICservice): 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) ... |
...
Code Block | ||||
---|---|---|---|---|
| ||||
... echo Deploying mysentiment_serviceanalysis... cd ../myaudio_servicesentiment cp -f {cert.pem, *.py, .pem,classifier.pickle,*.py} ../../docker/cbsrsic/my_servicesentiment # extra files canshould also be copiedinclduded if usedhere ... |
7. deploy the new service to the https://bitbucket.org/socialroboticshub/docker/src/master/ folder by running the deploy_to_docker.sh
file
8. update the https://bitbucket.org/socialroboticshub/docker/src/master/docker-compose.yml file in the docker
folder with the new service
Code Block | ||
---|---|---|
| ||
... # ------------------------------------------------------------ # Sentiment Analysis service # ------------------------------------------------------------ sentiment_analysis: image: sic_python3 build: context: . dockerfile: Dockerfile.python3 hostname: sentiment_analysis user: "${NEW_UID}:${NEW_GID}" env_file: - ./.env working_dir: /my_servicesentiment command: python3 sentiment_factory.py volumes: - ./cbsr/mock:/sentiment:rw${MOUNT_OPTIONS} tty: true stdin_open: falsepy networks: app_netvolumes: ipv4_address:- 172.16.238.x./sic/sentiment:/sentiment:rw,delegated # address has totty: differtrue from those of the already existing services'stdin_open: false depends_on: - redis - dialogflow # - any other services the service depends on ... |
...