From 42c3c5ce2bcd03d0b66c66309891643a2ad9695c Mon Sep 17 00:00:00 2001 From: Shahriar Tajbakhsh Date: Sat, 22 Sep 2018 13:51:26 +0100 Subject: [PATCH 01/26] Remove unneeded import --- docs/DiarizeApiV2.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/DiarizeApiV2.md b/docs/DiarizeApiV2.md index 782030c..067c2d2 100644 --- a/docs/DiarizeApiV2.md +++ b/docs/DiarizeApiV2.md @@ -15,7 +15,6 @@ Diarize an audio file. ### Example ```python from __future__ import print_function -import time import deepaffects from deepaffects.rest import ApiException from pprint import pprint From 2c4cc0cb1e064288766fecee2fa25234068ef058 Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Tue, 28 Aug 2018 16:23:13 +0530 Subject: [PATCH 02/26] Add unsent chunk --- examples/playlist_chunk_generator.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/examples/playlist_chunk_generator.py b/examples/playlist_chunk_generator.py index 45de621..d2fb86a 100644 --- a/examples/playlist_chunk_generator.py +++ b/examples/playlist_chunk_generator.py @@ -36,6 +36,7 @@ def chunk_generator_from_playlist(file_path=None, buffer_size=3): chunk = None chunk_index = 1 index = 0 + unsent_segment = False while endlist is not True: m3u8_obj = m3u8.load(audio_stream_url) @@ -46,15 +47,23 @@ def chunk_generator_from_playlist(file_path=None, buffer_size=3): if chunk_index == 1: chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") chunk_index = chunk_index + 1 + unsent_segment = True elif chunk_index < buffer_size: chunk = chunk + AudioSegment.from_file(io.BytesIO(buff), "aac") chunk_index = chunk_index + 1 + unsent_segment = True elif chunk_index == buffer_size: chunk = chunk + AudioSegment.from_file(io.BytesIO(buff), "aac") audio_segment, offset = get_segment_chunk_from_pydub_chunk(chunk, offset, index) + unsent_segment = False index = index + 1 yield audio_segment - chunk_index = 1 + chunk_index = 1 + if unsent_segment is True: + audio_segment, offset = get_segment_chunk_from_pydub_chunk(chunk, offset, index) + index = index + 1 + unsent_segment = False + yield audio_segment last_processed = m3u8_obj.media_sequence if m3u8_obj.data['is_endlist']: endlist = True From 4cbf7aee06e1edf695bc7010de5c9d24faf0e667 Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Mon, 10 Sep 2018 17:35:51 +0530 Subject: [PATCH 03/26] Limit segments to exact buffer size --- examples/playlist_chunk_generator.py | 42 ++++++++++++---------------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/examples/playlist_chunk_generator.py b/examples/playlist_chunk_generator.py index d2fb86a..b42b899 100644 --- a/examples/playlist_chunk_generator.py +++ b/examples/playlist_chunk_generator.py @@ -22,7 +22,7 @@ verbose = "True" -def chunk_generator_from_playlist(file_path=None, buffer_size=3): +def chunk_generator_from_playlist(file_path=None, buffer_size=30000): try: offset = 0 last_processed = -1 @@ -33,43 +33,37 @@ def chunk_generator_from_playlist(file_path=None, buffer_size=3): base_uri = m3u8_obj_outer.base_uri base_audio = m3u8_obj_outer.data['playlists'][0]['uri'] audio_stream_url = base_uri + base_audio - chunk = None chunk_index = 1 index = 0 unsent_segment = False - while endlist is not True: m3u8_obj = m3u8.load(audio_stream_url) - if last_processed < m3u8_obj.media_sequence: + if last_processed < m3u8_obj.media_sequence: for i, segment in enumerate(m3u8_obj.data['segments']): response = urlopen(base_uri + segment['uri']) - buff = response.read() + buff = response.read() if chunk_index == 1: - chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") - chunk_index = chunk_index + 1 - unsent_segment = True - elif chunk_index < buffer_size: - chunk = chunk + AudioSegment.from_file(io.BytesIO(buff), "aac") - chunk_index = chunk_index + 1 - unsent_segment = True - elif chunk_index == buffer_size: - chunk = chunk + AudioSegment.from_file(io.BytesIO(buff), "aac") - audio_segment, offset = get_segment_chunk_from_pydub_chunk(chunk, offset, index) - unsent_segment = False - index = index + 1 + chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") + else : + chunk = chunk + AudioSegment.from_file(io.BytesIO(buff), "aac") + offset_in_milliseconds = offset * 1000 + if (len(chunk) - (offset_in_milliseconds)) > buffer_size : + segment_chunk = segment = chunk[ offset_in_milliseconds: offset_in_milliseconds + buffer_size] + audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) + yield audio_segment + chunk_index = chunk_index + 1 + if(len(chunk) - (offset * 1000)) != 0: + segment_chunk = segment = chunk[ offset * 1000:] + audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) yield audio_segment - chunk_index = 1 - if unsent_segment is True: - audio_segment, offset = get_segment_chunk_from_pydub_chunk(chunk, offset, index) - index = index + 1 - unsent_segment = False - yield audio_segment last_processed = m3u8_obj.media_sequence - if m3u8_obj.data['is_endlist']: + + if m3u8_obj.data['is_endlist'] == True: endlist = True else: time.sleep(2) + except KeyboardInterrupt: print('Interrupted Stopping Stream') os._exit(0) From 8f47cb5c059c631a933d73d28e33bb2f4bbf0e9f Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Mon, 10 Sep 2018 23:12:22 +0530 Subject: [PATCH 04/26] Update playlist chunk generator --- examples/playlist_chunk_generator.py | 38 ++++++++++++++-------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/examples/playlist_chunk_generator.py b/examples/playlist_chunk_generator.py index b42b899..f98c6d6 100644 --- a/examples/playlist_chunk_generator.py +++ b/examples/playlist_chunk_generator.py @@ -28,8 +28,7 @@ def chunk_generator_from_playlist(file_path=None, buffer_size=30000): last_processed = -1 endlist = False # for playlists with m3u8 extensions - m3u8_obj_outer = m3u8.load( - file_path) + m3u8_obj_outer = m3u8.load(file_path) base_uri = m3u8_obj_outer.base_uri base_audio = m3u8_obj_outer.data['playlists'][0]['uri'] audio_stream_url = base_uri + base_audio @@ -37,25 +36,27 @@ def chunk_generator_from_playlist(file_path=None, buffer_size=30000): index = 0 unsent_segment = False while endlist is not True: - m3u8_obj = m3u8.load(audio_stream_url) - if last_processed < m3u8_obj.media_sequence: + m3u8_obj = m3u8.load(audio_stream_url) + if last_processed < m3u8_obj.media_sequence: for i, segment in enumerate(m3u8_obj.data['segments']): response = urlopen(base_uri + segment['uri']) - buff = response.read() + buff = response.read() if chunk_index == 1: - chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") - else : - chunk = chunk + AudioSegment.from_file(io.BytesIO(buff), "aac") - offset_in_milliseconds = offset * 1000 - if (len(chunk) - (offset_in_milliseconds)) > buffer_size : - segment_chunk = segment = chunk[ offset_in_milliseconds: offset_in_milliseconds + buffer_size] - audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) - yield audio_segment - chunk_index = chunk_index + 1 - if(len(chunk) - (offset * 1000)) != 0: - segment_chunk = segment = chunk[ offset * 1000:] - audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) - yield audio_segment + chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") + else: + chunk = chunk + AudioSegment.from_file(io.BytesIO(buff), "aac") + offset_in_milliseconds = offset * 1000 + if (len(chunk) - (offset_in_milliseconds)) > buffer_size: + segment_chunk = chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] + audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) + index = index + 1 + yield audio_segment + chunk_index = chunk_index + 1 + if (len(chunk) - (offset * 1000)) != 0: + segment_chunk = chunk[offset * 1000:] + audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) + index = index + 1 + yield audio_segment last_processed = m3u8_obj.media_sequence if m3u8_obj.data['is_endlist'] == True: @@ -63,7 +64,6 @@ def chunk_generator_from_playlist(file_path=None, buffer_size=30000): else: time.sleep(2) - except KeyboardInterrupt: print('Interrupted Stopping Stream') os._exit(0) From 1a965ec50d4562f3e0c5f73a37495e9e34ac5390 Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Wed, 3 Oct 2018 22:35:58 +0530 Subject: [PATCH 05/26] Update generator function for file and url to minimum 30 sec default --- deepaffects/realtime/util.py | 94 ++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 46 deletions(-) diff --git a/deepaffects/realtime/util.py b/deepaffects/realtime/util.py index e39084c..9709e93 100644 --- a/deepaffects/realtime/util.py +++ b/deepaffects/realtime/util.py @@ -51,7 +51,7 @@ def get_deepaffects_client(host_url='realtime.deepaffects.com:80'): return stub -def chunk_generator_from_file(file_path, max_chunk_size=30000, min_chunk_size=3000): +def chunk_generator_from_file(file_path, buffer_size=30000): # Implement this generator function to yield Audio segments # To generate Audio Segments use segment_chunk # from deepaffects.realtime.types import segment_chunk @@ -71,59 +71,61 @@ def chunk_generator_from_file(file_path, max_chunk_size=30000, min_chunk_size=30 segments more than 3 sec AudioSegment and yields base64 encoded audio segment objects asynchronously """ - audio_clip = AudioSegment.from_file(file_path) + audio_clip = AudioSegment.from_file(file_path) offset = None - previous_chunk = None - - for i, chunk in enumerate(audio_clip[::max_chunk_size]): + buffer_chunk = None + index = 0 + for i, chunk in enumerate(audio_clip[::buffer_size]): if offset is None: offset = 0 - if previous_chunk is not None: - if len(chunk) <= min_chunk_size: - previous_chunk = previous_chunk + chunk - - elif (len(chunk) < max_chunk_size) and (len(chunk) > min_chunk_size): - audio_segment, offset = get_segment_chunk_from_pydub_chunk( - previous_chunk, offset, i) - previous_chunk = chunk - yield audio_segment - - else: - audio_segment, offset = get_segment_chunk_from_pydub_chunk( - previous_chunk, offset, i) - previous_chunk = chunk - yield audio_segment - - if previous_chunk is None: - if len(audio_clip) < max_chunk_size: - audio_segment, offset = get_segment_chunk_from_pydub_chunk( - chunk, offset, i) - yield audio_segment - previous_chunk = chunk - audio_segment, offset = get_segment_chunk_from_pydub_chunk( - previous_chunk, offset, i) - yield audio_segment - - - -def chunk_generator_from_url(file_path, is_youtube_url=False, chunk_size=15 * 8192): + if i == 0: + buffer_chunk = chunk + else: + buffer_chunk = buffer_chunk + chunk + offset_in_milliseconds = offset * 1000 + if ((len(buffer_chunk) - (offset_in_milliseconds)) > buffer_size): + segment_chunk = buffer_chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] + audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) + index = index + 1 + yield audio_segment + + if ((len(buffer_chunk) - (offset * 1000)) != 0): + segment_chunk = buffer_chunk[offset * 1000:] + audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) + index = index + 1 + yield audio_segment + + + +def chunk_generator_from_url(file_path, is_youtube_url=False, buffer_size=30000, chunk_size=15 * 8192): if is_youtube_url: yt = YouTube(file_path) stream = yt.streams.filter(only_audio=True).first() download_url = stream.url else: download_url = file_path - - final_chunk = None - last_seg_len = 0 - for i, chunk in enumerate(get(url=download_url, streaming=True, chunk_size=chunk_size)): - if final_chunk is None: - final_chunk = chunk + offset = None + buffer_chunk = None + index = 0 + for i, chunk in enumerate(get(url=download_url, streaming=True, chunk_size=chunk_size)): + if offset is None: + offset = 0 + if i == 0: + buffer_chunk_raw = chunk else: - final_chunk = final_chunk + chunk - seg = AudioSegment.from_file(io.BytesIO( - final_chunk)) - audio_segment, offset = get_segment_chunk_from_pydub_chunk( - seg[last_seg_len:], last_seg_len / 1000, i) + buffer_chunk_raw = buffer_chunk_raw + chunk + + buffer_chunk = AudioSegment.from_file(io.BytesIO( + buffer_chunk_raw)) + + offset_in_milliseconds = offset * 1000 + if (len(buffer_chunk) - (offset_in_milliseconds)) > buffer_size: + segment_chunk = buffer_chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] + audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) + index = index + 1 + yield audio_segment + if (len(buffer_chunk) - (offset * 1000)) != 0: + segment_chunk = buffer_chunk[offset * 1000:] + audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) + index = index + 1 yield audio_segment - last_seg_len = int(seg.duration_seconds * 1000) From 9d2d664629efbf98be91f53ef6c420d2255fd79b Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Wed, 3 Oct 2018 22:44:00 +0530 Subject: [PATCH 06/26] Remove default param from example --- deepaffects/realtime/util.py | 6 +++--- examples/speaker_identify_example.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deepaffects/realtime/util.py b/deepaffects/realtime/util.py index 9709e93..c8ce02a 100644 --- a/deepaffects/realtime/util.py +++ b/deepaffects/realtime/util.py @@ -51,7 +51,7 @@ def get_deepaffects_client(host_url='realtime.deepaffects.com:80'): return stub -def chunk_generator_from_file(file_path, buffer_size=30000): +def chunk_generator_from_file(file_path, buffer_size=30000): # Implement this generator function to yield Audio segments # To generate Audio Segments use segment_chunk # from deepaffects.realtime.types import segment_chunk @@ -71,11 +71,11 @@ def chunk_generator_from_file(file_path, buffer_size=30000): segments more than 3 sec AudioSegment and yields base64 encoded audio segment objects asynchronously """ - audio_clip = AudioSegment.from_file(file_path) + audio_clip = AudioSegment.from_file(file_path) offset = None buffer_chunk = None index = 0 - for i, chunk in enumerate(audio_clip[::buffer_size]): + for i, chunk in enumerate(audio_clip[::buffer_size]): if offset is None: offset = 0 if i == 0: diff --git a/examples/speaker_identify_example.py b/examples/speaker_identify_example.py index 5984db5..fcfd6da 100644 --- a/examples/speaker_identify_example.py +++ b/examples/speaker_identify_example.py @@ -34,7 +34,7 @@ """Stream audio from local file. """ responses = client.IdentifySpeaker( - chunk_generator_from_file(file_path, max_chunk_size=30000), TIMEOUT_SECONDS, metadata=metadata) + chunk_generator_from_file(file_path), TIMEOUT_SECONDS, metadata=metadata) # responses is the iterator for all the response values for response in responses: From 108b758ad2bf9d10e54c8a946e659fe38df65dcf Mon Sep 17 00:00:00 2001 From: Sushant Hiray Date: Wed, 3 Oct 2018 13:16:44 -0700 Subject: [PATCH 07/26] Release v1.3.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 77ed33f..c702221 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ import os NAME = "deepaffects" -VERSION = "1.2.0" +VERSION = "1.3.0" # To install the library, run the following # # python setup.py install From e91830b6314ff85da64b77bfc997d6adda87b93c Mon Sep 17 00:00:00 2001 From: Sushant Hiray Date: Wed, 3 Oct 2018 13:25:58 -0700 Subject: [PATCH 08/26] add long_description_content_type --- setup.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/setup.py b/setup.py index c702221..73d6efd 100644 --- a/setup.py +++ b/setup.py @@ -18,18 +18,8 @@ def readme(): - try: - from pypandoc import convert - return convert('README.md', 'rst') - - except ImportError: - with open(os.path.join(os.path.dirname(__file__), 'README.md')) as readme: - return readme.read() - - except OSError: - with open(os.path.join(os.path.dirname(__file__), 'README.md')) as readme: - return readme.read() - + with open(os.path.join(os.path.dirname(__file__), 'README.md')) as readme: + return readme.read() setup( name=NAME, @@ -45,5 +35,6 @@ def readme(): install_requires=REQUIRES, packages=find_packages(), include_package_data=True, - long_description=readme() + long_description=readme(), + long_description_content_type="text/markdown" ) From 4ccbe46861a2eb5f04071050bf94d967a360f279 Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Fri, 5 Oct 2018 23:30:56 +0530 Subject: [PATCH 09/26] Add error handling for file not found --- deepaffects/realtime/util.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/deepaffects/realtime/util.py b/deepaffects/realtime/util.py index c8ce02a..ad5e654 100644 --- a/deepaffects/realtime/util.py +++ b/deepaffects/realtime/util.py @@ -8,6 +8,7 @@ import sys import pydub import base64 +import uuid from pydub import AudioSegment from pytube.request import get from pytube import YouTube @@ -36,12 +37,14 @@ def get_segment_chunk_from_pydub_chunk(chunk, offset, i): return audio_segments, offset -def pydub_segment_to_base64(chunk,i): - chunk_file = "chunk-{}.wav".format(i) - with open(chunk_file, "wb") as f: - chunk.export(f, format="wav") +def pydub_segment_to_base64(chunk,i): + chunk_file = "chunk-{}-{}.wav".format(i, str(uuid.uuid4())) + chunk.export(chunk_file, format="wav") base64_chunk = encode_to_base64(chunk_file) - os.remove(chunk_file) + try: + os.remove(chunk_file) + except: + pass return base64_chunk From 0c92967a5961b585e6617acf28968f35a45a804c Mon Sep 17 00:00:00 2001 From: Sushant Hiray Date: Sun, 7 Oct 2018 21:09:05 -0700 Subject: [PATCH 10/26] Bump version to v1.3.1 --- README.md | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 87a04f2..f04fe88 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # deepaffects-python -[![Build Status](https://travis-ci.org/SEERNET/deepaffects-python.svg)](https://travis-ci.org/SEERNET/deepaffects-python) +[![Build Status](https://travis-ci.org/SEERNET/deepaffects-python.svg?branch=master)](https://travis-ci.org/SEERNET/deepaffects-python) [![PyPI version](https://badge.fury.io/py/deepaffects.svg)](https://badge.fury.io/py/deepaffects) Python client library for DeepAffects APIs diff --git a/setup.py b/setup.py index 73d6efd..892193c 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ import os NAME = "deepaffects" -VERSION = "1.3.0" +VERSION = "1.3.1" # To install the library, run the following # # python setup.py install From b3fed18c92e6189ba14e4baf9d8fca62611aad43 Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Sat, 13 Oct 2018 05:30:01 +0530 Subject: [PATCH 11/26] Add ticker example --- ...cker_based_earnings_call_identification.py | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 examples/ticker_based_earnings_call_identification.py diff --git a/examples/ticker_based_earnings_call_identification.py b/examples/ticker_based_earnings_call_identification.py new file mode 100644 index 0000000..1a6eaf6 --- /dev/null +++ b/examples/ticker_based_earnings_call_identification.py @@ -0,0 +1,119 @@ +from deepaffects.realtime.util import get_deepaffects_client, chunk_generator_from_file, chunk_generator_from_url +import m3u8 +from pprint import pprint +from pytube.compat import urlopen +from pydub import AudioSegment +import io +import time +import os +import pprint +import sys +from deepaffects.realtime.util import get_segment_chunk_from_pydub_chunk + +TIMEOUT_SECONDS = 10000 +apikey = "YOUR_API_KEY" +file_path = "PLAYLIST_PATH" +is_youtube_url = False +languageCode = "en-Us" +sampleRate = "16000" +encoding = "mp3" +apiVersion = "v2" +ticker = "TICKER_SYMBOL_FOR_COMPANY" + + + +def chunk_generator_from_playlist(file_path=None, buffer_size=30000): + try: + offset = 0 + last_processed = -1 + endlist = False + # for playlists with m3u8 extensions + m3u8_obj_outer = m3u8.load(file_path) + base_uri = m3u8_obj_outer.base_uri + base_audio = m3u8_obj_outer.data['playlists'][0]['uri'] + audio_stream_url = base_uri + base_audio + chunk_index = 1 + index = 0 + unsent_segment = False + while endlist is not True: + m3u8_obj = m3u8.load(audio_stream_url) + if last_processed < m3u8_obj.media_sequence: + for i, segment in enumerate(m3u8_obj.data['segments']): + response = urlopen(base_uri + segment['uri']) + buff = response.read() + if chunk_index == 1: + chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") + else: + chunk = chunk + AudioSegment.from_file(io.BytesIO(buff), "aac") + offset_in_milliseconds = offset * 1000 + if (len(chunk) - (offset_in_milliseconds)) > buffer_size: + segment_chunk = chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] + audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) + index = index + 1 + yield audio_segment + chunk_index = chunk_index + 1 + if (len(chunk) - (offset * 1000)) != 0: + segment_chunk = chunk[offset * 1000:] + audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) + index = index + 1 + yield audio_segment + last_processed = m3u8_obj.media_sequence + + if m3u8_obj.data['is_endlist'] == True: + endlist = True + else: + time.sleep(2) + + except KeyboardInterrupt: + print('Interrupted Stopping Stream') + os._exit(0) + +# DeepAffects realtime Api client +client = get_deepaffects_client() + +metadata = [ + ('apikey', apikey), + ('encoding', encoding), + ('samplerate', sampleRate), + ('languagecode', languageCode), + ('apiversion', apiVersion), + ('verbose', verbose), + ('ticker', ticker) +] + +# Implement chunk_generator() is a generator function which yields segment_chunk objects asynchronously +# from deepaffects.realtime.types import segment_chunk +# yield segment_chunk(Args) +"""segment_chunk. + +Args: + encoding : Audio Encoding, + languageCode: language code , + sampleRate: sample rate of audio , + content: base64 encoded audio, + segmentOffset: offset of the segment in complete audio stream +""" + +""" +Sample implementation which reads audio from a file and splits it into +segments more than 3 sec +AudioSegment and yields base64 encoded audio segment objects asynchronously +""" + +"""Stream audio from earningcast. +""" +responses = client.DiarizeEmotion( + chunk_generator_from_playlist(file_path), TIMEOUT_SECONDS, metadata=metadata) + +# responses is the iterator for all the response values +for response in responses: + print("Received message") + print(response) + +"""Response. + response = { + emotion: Emotion identified in the segment, + start: start of the segment, + end: end of the segment + } +""" From 1b17b26a1aec0c5f0b96fc2dcb0101e81965f6eb Mon Sep 17 00:00:00 2001 From: Sushant Hiray Date: Sun, 14 Oct 2018 23:50:12 -0700 Subject: [PATCH 12/26] Remove verbose --- examples/ticker_based_earnings_call_identification.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/examples/ticker_based_earnings_call_identification.py b/examples/ticker_based_earnings_call_identification.py index 1a6eaf6..e50eb37 100644 --- a/examples/ticker_based_earnings_call_identification.py +++ b/examples/ticker_based_earnings_call_identification.py @@ -20,8 +20,6 @@ apiVersion = "v2" ticker = "TICKER_SYMBOL_FOR_COMPANY" - - def chunk_generator_from_playlist(file_path=None, buffer_size=30000): try: offset = 0 @@ -47,7 +45,7 @@ def chunk_generator_from_playlist(file_path=None, buffer_size=30000): chunk = chunk + AudioSegment.from_file(io.BytesIO(buff), "aac") offset_in_milliseconds = offset * 1000 if (len(chunk) - (offset_in_milliseconds)) > buffer_size: - segment_chunk = chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] + segment_chunk = chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) index = index + 1 yield audio_segment @@ -72,13 +70,12 @@ def chunk_generator_from_playlist(file_path=None, buffer_size=30000): client = get_deepaffects_client() metadata = [ - ('apikey', apikey), + ('apikey', apikey), ('encoding', encoding), ('samplerate', sampleRate), ('languagecode', languageCode), ('apiversion', apiVersion), - ('verbose', verbose), - ('ticker', ticker) + ('ticker', ticker) ] # Implement chunk_generator() is a generator function which yields segment_chunk objects asynchronously From 4539ea3dc7452b72c4ed2088924c06044433f019 Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Tue, 16 Oct 2018 23:14:16 +0530 Subject: [PATCH 13/26] Update playlist chunk generator with error habdling for live streams --- ...cker_based_earnings_call_identification.py | 70 +++++++++++-------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/examples/ticker_based_earnings_call_identification.py b/examples/ticker_based_earnings_call_identification.py index e50eb37..42c9168 100644 --- a/examples/ticker_based_earnings_call_identification.py +++ b/examples/ticker_based_earnings_call_identification.py @@ -6,21 +6,23 @@ import io import time import os +import json import pprint import sys from deepaffects.realtime.util import get_segment_chunk_from_pydub_chunk TIMEOUT_SECONDS = 10000 -apikey = "YOUR_API_KEY" -file_path = "PLAYLIST_PATH" +apikey = "API_KEY" +file_path = 'PLAYLIST_URL' is_youtube_url = False languageCode = "en-Us" sampleRate = "16000" encoding = "mp3" apiVersion = "v2" -ticker = "TICKER_SYMBOL_FOR_COMPANY" +ticker = "TICKER_SYMBOL" def chunk_generator_from_playlist(file_path=None, buffer_size=30000): + chunk = None try: offset = 0 last_processed = -1 @@ -34,37 +36,43 @@ def chunk_generator_from_playlist(file_path=None, buffer_size=30000): index = 0 unsent_segment = False while endlist is not True: - m3u8_obj = m3u8.load(audio_stream_url) - if last_processed < m3u8_obj.media_sequence: - for i, segment in enumerate(m3u8_obj.data['segments']): - response = urlopen(base_uri + segment['uri']) - buff = response.read() - if chunk_index == 1: - chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") - else: - chunk = chunk + AudioSegment.from_file(io.BytesIO(buff), "aac") - offset_in_milliseconds = offset * 1000 - if (len(chunk) - (offset_in_milliseconds)) > buffer_size: - segment_chunk = chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] - audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) - index = index + 1 - yield audio_segment - chunk_index = chunk_index + 1 - if (len(chunk) - (offset * 1000)) != 0: - segment_chunk = chunk[offset * 1000:] - audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) - index = index + 1 - yield audio_segment - last_processed = m3u8_obj.media_sequence + try: + m3u8_obj = m3u8.load(audio_stream_url) + if last_processed < m3u8_obj.media_sequence: + for i, segment in enumerate(m3u8_obj.data['segments']): + response = urlopen(base_uri + segment['uri']) + buff = response.read() + if (chunk_index == 1) and (last_processed == -1): + chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") + else: + chunk = chunk + AudioSegment.from_file(io.BytesIO(buff), "aac") + offset_in_milliseconds = offset * 1000 + if (len(chunk) - (offset_in_milliseconds)) > buffer_size: + segment_chunk = chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] + audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) + index = index + 1 + yield audio_segment + chunk_index = chunk_index + 1 + last_processed = m3u8_obj.media_sequence - if m3u8_obj.data['is_endlist'] == True: + if m3u8_obj.data['is_endlist'] == True: + endlist = True + else: + time.sleep(2) + except Exception as e: + print(e) endlist = True - else: - time.sleep(2) - except KeyboardInterrupt: - print('Interrupted Stopping Stream') - os._exit(0) + if (len(chunk) - (offset * 1000)) > 0: + segment_chunk = chunk[offset * 1000:] + audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) + index = index + 1 + yield audio_segment + + except Exception as e: + print(e) + finally: + chunk.export(ticker + "_audio_out.wav", format="wav") # DeepAffects realtime Api client client = get_deepaffects_client() From f001d8112a60e3d94b15d99596df179b7f7d00d5 Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Mon, 22 Oct 2018 02:15:26 +0530 Subject: [PATCH 14/26] Fix high sampling rate --- examples/playlist_chunk_generator.py | 7 +++++-- examples/ticker_based_earnings_call_identification.py | 10 ++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/examples/playlist_chunk_generator.py b/examples/playlist_chunk_generator.py index f98c6d6..c23033d 100644 --- a/examples/playlist_chunk_generator.py +++ b/examples/playlist_chunk_generator.py @@ -41,10 +41,13 @@ def chunk_generator_from_playlist(file_path=None, buffer_size=30000): for i, segment in enumerate(m3u8_obj.data['segments']): response = urlopen(base_uri + segment['uri']) buff = response.read() + new_chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") + if new_chunk.frame_rate > 16000: + new_chunk = new_chunk.set_frame_rate(16000) if chunk_index == 1: - chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") + chunk = new_chunk else: - chunk = chunk + AudioSegment.from_file(io.BytesIO(buff), "aac") + chunk = chunk + new_chunk offset_in_milliseconds = offset * 1000 if (len(chunk) - (offset_in_milliseconds)) > buffer_size: segment_chunk = chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] diff --git a/examples/ticker_based_earnings_call_identification.py b/examples/ticker_based_earnings_call_identification.py index 42c9168..5607039 100644 --- a/examples/ticker_based_earnings_call_identification.py +++ b/examples/ticker_based_earnings_call_identification.py @@ -42,10 +42,16 @@ def chunk_generator_from_playlist(file_path=None, buffer_size=30000): for i, segment in enumerate(m3u8_obj.data['segments']): response = urlopen(base_uri + segment['uri']) buff = response.read() + new_chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") + + if new_chunk.frame_rate > 16000: + new_chunk = new_chunk.set_frame_rate(16000) + if (chunk_index == 1) and (last_processed == -1): - chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") + chunk = new_chunk else: - chunk = chunk + AudioSegment.from_file(io.BytesIO(buff), "aac") + chunk = chunk + new_chunk + offset_in_milliseconds = offset * 1000 if (len(chunk) - (offset_in_milliseconds)) > buffer_size: segment_chunk = chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] From ff5a3b9d0e6faefb494321bce959b0bf69c98d82 Mon Sep 17 00:00:00 2001 From: Sushant Hiray Date: Sun, 21 Oct 2018 13:55:48 -0700 Subject: [PATCH 15/26] Bump version to v.1.3.2 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 892193c..f4364c8 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ import os NAME = "deepaffects" -VERSION = "1.3.1" +VERSION = "1.3.2" # To install the library, run the following # # python setup.py install From 4941a094c96f05333b0446b5b2991e957e0aa342 Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Wed, 14 Nov 2018 17:29:00 +0530 Subject: [PATCH 16/26] Add sampling rate to audio chunk --- deepaffects/realtime/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepaffects/realtime/util.py b/deepaffects/realtime/util.py index ad5e654..3477b17 100644 --- a/deepaffects/realtime/util.py +++ b/deepaffects/realtime/util.py @@ -29,7 +29,7 @@ def get_segment_chunk_from_pydub_chunk(chunk, offset, i): audio_segments = segment_chunk( encoding="wav", languageCode="en-US", - sampleRate=8000, + sampleRate=chunk.frame_rate, content=base64_chunk, duration=len(chunk) / 1000, segmentOffset=offset) From cacd93ffbaefd7e2356b32377daa4a3bac7907ed Mon Sep 17 00:00:00 2001 From: Sushant Hiray Date: Fri, 16 Nov 2018 06:39:34 +0100 Subject: [PATCH 17/26] Release v1.3.3 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f4364c8..f218448 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ import os NAME = "deepaffects" -VERSION = "1.3.2" +VERSION = "1.3.3" # To install the library, run the following # # python setup.py install From 50f99c653e74203ea1b92bcec9ab69a46d94dad1 Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Fri, 23 Nov 2018 18:43:28 +0530 Subject: [PATCH 18/26] Add playlist chunk generator as library function --- deepaffects/realtime/util.py | 67 +++++++++++- examples/playlist_chunk_generator.py | 71 +----------- ...cker_based_earnings_call_identification.py | 102 +++--------------- requirements.txt | 4 +- 4 files changed, 85 insertions(+), 159 deletions(-) diff --git a/deepaffects/realtime/util.py b/deepaffects/realtime/util.py index 3477b17..0758f1a 100644 --- a/deepaffects/realtime/util.py +++ b/deepaffects/realtime/util.py @@ -1,16 +1,19 @@ from __future__ import print_function - import random import time import grpc import os +import uuid import io import sys +import m3u8 import pydub +import requests import base64 import uuid from pydub import AudioSegment from pytube.request import get +from pytube.compat import urlopen from pytube import YouTube import deepaffects.realtime.deepaffects_realtime_pb2_grpc as deepaffects_grpc @@ -54,6 +57,68 @@ def get_deepaffects_client(host_url='realtime.deepaffects.com:80'): return stub +def chunk_generator_from_playlist(out_file_name=None, file_path=None, buffer_size=30000, download_audio=True): + chunk = None + try: + offset = 0 + last_processed = -1 + endlist = False + # for playlists with m3u8 extensions + m3u8_obj_outer = m3u8.load(file_path) + base_uri = m3u8_obj_outer.base_uri + base_audio = m3u8_obj_outer.data['playlists'][0]['uri'] + audio_stream_url = base_uri + base_audio + chunk_index = 1 + index = 0 + unsent_segment = False + while endlist is not True: + try: + m3u8_obj = m3u8.load(audio_stream_url) + if last_processed < m3u8_obj.media_sequence: + for i, segment in enumerate(m3u8_obj.data['segments']): + response = urlopen(base_uri + segment['uri']) + buff = response.read() + new_chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") + + if (chunk_index == 1) and (last_processed == -1): + chunk = new_chunk + else: + chunk = chunk + new_chunk + + offset_in_milliseconds = offset * 1000 + if (len(chunk) - (offset_in_milliseconds)) > buffer_size: + segment_chunk = chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] + audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) + index = index + 1 + yield audio_segment + chunk_index = chunk_index + 1 + last_processed = m3u8_obj.media_sequence + + if m3u8_obj.data['is_endlist'] == True: + endlist = True + else: + time.sleep(2) + except Exception as e: + print(e) + endlist = True + + if (len(chunk) - (offset * 1000)) > 0: + segment_chunk = chunk[offset * 1000:] + audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) + index = index + 1 + yield audio_segment + + except Exception as e: + print(e) + finally: + if download_audio and (out_file_name is not None): + dir_path = "./output" + if not os.path.exists(dir_path): + os.makedirs(dir_path) + chunk.export(dir_path + out_file_name + "-audio-out.wav", format="wav") + + + def chunk_generator_from_file(file_path, buffer_size=30000): # Implement this generator function to yield Audio segments # To generate Audio Segments use segment_chunk diff --git a/examples/playlist_chunk_generator.py b/examples/playlist_chunk_generator.py index c23033d..1608a7b 100644 --- a/examples/playlist_chunk_generator.py +++ b/examples/playlist_chunk_generator.py @@ -1,86 +1,19 @@ -from deepaffects.realtime.util import get_deepaffects_client, chunk_generator_from_file, chunk_generator_from_url -import m3u8 -from pprint import pprint -from pytube.compat import urlopen -from pydub import AudioSegment -import io -import time -import os -import pprint -import sys -from deepaffects.realtime.util import get_segment_chunk_from_pydub_chunk +from deepaffects.realtime.util import get_deepaffects_client, chunk_generator_from_file, chunk_generator_from_url, chunk_generator_from_playlist TIMEOUT_SECONDS = 10000 apikey = "YOUR_API_KEY" file_path = "PLAYLIST_PATH" -is_youtube_url = False languageCode = "en-Us" -sampleRate = "16000" -encoding = "mp3" speakerIds = "list of userids for for speaker verification seperated by ','" -apiVersion = "v2" verbose = "True" - -def chunk_generator_from_playlist(file_path=None, buffer_size=30000): - try: - offset = 0 - last_processed = -1 - endlist = False - # for playlists with m3u8 extensions - m3u8_obj_outer = m3u8.load(file_path) - base_uri = m3u8_obj_outer.base_uri - base_audio = m3u8_obj_outer.data['playlists'][0]['uri'] - audio_stream_url = base_uri + base_audio - chunk_index = 1 - index = 0 - unsent_segment = False - while endlist is not True: - m3u8_obj = m3u8.load(audio_stream_url) - if last_processed < m3u8_obj.media_sequence: - for i, segment in enumerate(m3u8_obj.data['segments']): - response = urlopen(base_uri + segment['uri']) - buff = response.read() - new_chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") - if new_chunk.frame_rate > 16000: - new_chunk = new_chunk.set_frame_rate(16000) - if chunk_index == 1: - chunk = new_chunk - else: - chunk = chunk + new_chunk - offset_in_milliseconds = offset * 1000 - if (len(chunk) - (offset_in_milliseconds)) > buffer_size: - segment_chunk = chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] - audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) - index = index + 1 - yield audio_segment - chunk_index = chunk_index + 1 - if (len(chunk) - (offset * 1000)) != 0: - segment_chunk = chunk[offset * 1000:] - audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) - index = index + 1 - yield audio_segment - last_processed = m3u8_obj.media_sequence - - if m3u8_obj.data['is_endlist'] == True: - endlist = True - else: - time.sleep(2) - - except KeyboardInterrupt: - print('Interrupted Stopping Stream') - os._exit(0) - # DeepAffects realtime Api client client = get_deepaffects_client() metadata = [ ('apikey', apikey), ('speakerids', speakerIds), - ('encoding', encoding), - ('samplerate', sampleRate), - ('languagecode', languageCode), - ('apiversion', apiVersion), + ('languagecode', languageCode), ('verbose', verbose) ] diff --git a/examples/ticker_based_earnings_call_identification.py b/examples/ticker_based_earnings_call_identification.py index 5607039..0b0ac16 100644 --- a/examples/ticker_based_earnings_call_identification.py +++ b/examples/ticker_based_earnings_call_identification.py @@ -1,95 +1,18 @@ -from deepaffects.realtime.util import get_deepaffects_client, chunk_generator_from_file, chunk_generator_from_url -import m3u8 -from pprint import pprint -from pytube.compat import urlopen -from pydub import AudioSegment -import io -import time -import os -import json -import pprint -import sys -from deepaffects.realtime.util import get_segment_chunk_from_pydub_chunk +from deepaffects.realtime.util import get_deepaffects_client, chunk_generator_from_file, chunk_generator_from_url, chunk_generator_from_playlist TIMEOUT_SECONDS = 10000 -apikey = "API_KEY" -file_path = 'PLAYLIST_URL' -is_youtube_url = False -languageCode = "en-Us" -sampleRate = "16000" -encoding = "mp3" -apiVersion = "v2" +apikey = "YOUR_API_KEY" +file_path = "PLAYLIST_PATH" ticker = "TICKER_SYMBOL" - -def chunk_generator_from_playlist(file_path=None, buffer_size=30000): - chunk = None - try: - offset = 0 - last_processed = -1 - endlist = False - # for playlists with m3u8 extensions - m3u8_obj_outer = m3u8.load(file_path) - base_uri = m3u8_obj_outer.base_uri - base_audio = m3u8_obj_outer.data['playlists'][0]['uri'] - audio_stream_url = base_uri + base_audio - chunk_index = 1 - index = 0 - unsent_segment = False - while endlist is not True: - try: - m3u8_obj = m3u8.load(audio_stream_url) - if last_processed < m3u8_obj.media_sequence: - for i, segment in enumerate(m3u8_obj.data['segments']): - response = urlopen(base_uri + segment['uri']) - buff = response.read() - new_chunk = AudioSegment.from_file(io.BytesIO(buff), "aac") - - if new_chunk.frame_rate > 16000: - new_chunk = new_chunk.set_frame_rate(16000) - - if (chunk_index == 1) and (last_processed == -1): - chunk = new_chunk - else: - chunk = chunk + new_chunk - - offset_in_milliseconds = offset * 1000 - if (len(chunk) - (offset_in_milliseconds)) > buffer_size: - segment_chunk = chunk[offset_in_milliseconds: offset_in_milliseconds + buffer_size] - audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) - index = index + 1 - yield audio_segment - chunk_index = chunk_index + 1 - last_processed = m3u8_obj.media_sequence - - if m3u8_obj.data['is_endlist'] == True: - endlist = True - else: - time.sleep(2) - except Exception as e: - print(e) - endlist = True - - if (len(chunk) - (offset * 1000)) > 0: - segment_chunk = chunk[offset * 1000:] - audio_segment, offset = get_segment_chunk_from_pydub_chunk(segment_chunk, offset, index) - index = index + 1 - yield audio_segment - - except Exception as e: - print(e) - finally: - chunk.export(ticker + "_audio_out.wav", format="wav") - -# DeepAffects realtime Api client -client = get_deepaffects_client() +out_file_name = "OUT_FILE_NAME" +languageCode = "en-Us" +verbose = "True" metadata = [ - ('apikey', apikey), - ('encoding', encoding), - ('samplerate', sampleRate), - ('languagecode', languageCode), - ('apiversion', apiVersion), - ('ticker', ticker) + ('apikey', apikey), + ('languagecode', languageCode), + ('ticker', ticker), + ('verbose', verbose) ] # Implement chunk_generator() is a generator function which yields segment_chunk objects asynchronously @@ -113,8 +36,11 @@ def chunk_generator_from_playlist(file_path=None, buffer_size=30000): """Stream audio from earningcast. """ +# DeepAffects realtime Api client +client = get_deepaffects_client() + responses = client.DiarizeEmotion( - chunk_generator_from_playlist(file_path), TIMEOUT_SECONDS, metadata=metadata) + chunk_generator_from_playlist(out_file_name=out_file_name, file_path=file_path), TIMEOUT_SECONDS, metadata=metadata) # responses is the iterator for all the response values for response in responses: diff --git a/requirements.txt b/requirements.txt index 3048d34..65b6dc9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,6 @@ pydub==0.22.1 six==1.11.0 grpcio==1.13.0 protobuf==3.6.0 -pytube==9.2.2 \ No newline at end of file +pytube==9.2.2 +m3u8==0.3.6 +requests==2.19.1 \ No newline at end of file From 18bed793a5efba17b3b8f08da20e41131d6fc9d1 Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Fri, 23 Nov 2018 19:31:48 +0530 Subject: [PATCH 19/26] Remove language code --- examples/playlist_chunk_generator.py | 2 -- examples/ticker_based_earnings_call_identification.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/examples/playlist_chunk_generator.py b/examples/playlist_chunk_generator.py index 1608a7b..ff8bbd6 100644 --- a/examples/playlist_chunk_generator.py +++ b/examples/playlist_chunk_generator.py @@ -3,7 +3,6 @@ TIMEOUT_SECONDS = 10000 apikey = "YOUR_API_KEY" file_path = "PLAYLIST_PATH" -languageCode = "en-Us" speakerIds = "list of userids for for speaker verification seperated by ','" verbose = "True" @@ -13,7 +12,6 @@ metadata = [ ('apikey', apikey), ('speakerids', speakerIds), - ('languagecode', languageCode), ('verbose', verbose) ] diff --git a/examples/ticker_based_earnings_call_identification.py b/examples/ticker_based_earnings_call_identification.py index 0b0ac16..8356ac4 100644 --- a/examples/ticker_based_earnings_call_identification.py +++ b/examples/ticker_based_earnings_call_identification.py @@ -5,12 +5,10 @@ file_path = "PLAYLIST_PATH" ticker = "TICKER_SYMBOL" out_file_name = "OUT_FILE_NAME" -languageCode = "en-Us" verbose = "True" metadata = [ ('apikey', apikey), - ('languagecode', languageCode), ('ticker', ticker), ('verbose', verbose) ] From 40ac490559dd34de0f88bcd170e5c72bb506d0de Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Fri, 23 Nov 2018 20:19:31 +0530 Subject: [PATCH 20/26] Add score params to protobuff --- .../realtime/deepaffects_realtime_pb2.py | 677 +++++++++--------- .../realtime/deepaffects_realtime_pb2_grpc.py | 122 ++-- 2 files changed, 404 insertions(+), 395 deletions(-) diff --git a/deepaffects/realtime/deepaffects_realtime_pb2.py b/deepaffects/realtime/deepaffects_realtime_pb2.py index 18a6fab..6cbc5c8 100644 --- a/deepaffects/realtime/deepaffects_realtime_pb2.py +++ b/deepaffects/realtime/deepaffects_realtime_pb2.py @@ -2,315 +2,325 @@ # source: deepaffects-realtime.proto import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database from google.protobuf import descriptor_pb2 -_b = sys.version_info[0] < 3 and ( - lambda x: x) or (lambda x: x.encode('latin1')) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() + + DESCRIPTOR = _descriptor.FileDescriptor( - name='deepaffects-realtime.proto', - package='deepaffectsrealtime', - syntax='proto3', - serialized_pb=_b('\n\x1a\x64\x65\x65paffects-realtime.proto\x12\x13\x64\x65\x65paffectsrealtime\"\xb3\x01\n\x0cSegmentChunk\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\x12\x10\n\x08\x65ncoding\x18\x03 \x01(\t\x12\x14\n\x0clanguageCode\x18\x04 \x01(\t\x12\x12\n\nsampleRate\x18\x05 \x01(\x05\x12\x12\n\nspeakerIds\x18\x06 \x03(\t\x12\x15\n\rsegmentOffset\x18\x07 \x01(\x01\x12\x10\n\x08\x64uration\x18\x08 \x01(\x01\x12\r\n\x05\x45rror\x18\t \x01(\t\"j\n\x0eSegmentSpeaker\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x12\n\nspeaker_id\x18\x02 \x01(\t\x12\r\n\x05start\x18\x03 \x01(\x01\x12\x0b\n\x03\x65nd\x18\x04 \x01(\x01\x12\r\n\x05\x45rror\x18\x05 \x01(\t\x12\r\n\x05score\x18\x06 \x01(\x02\"g\n\x0eSegmentEmotion\x12\n\n\x02id\x18\x01 \x01(\x05\x12\r\n\x05start\x18\x02 \x01(\x01\x12\x0b\n\x03\x65nd\x18\x03 \x01(\x01\x12\x0f\n\x07\x65motion\x18\x04 \x01(\t\x12\r\n\x05\x45rror\x18\x05 \x01(\t\x12\r\n\x05score\x18\x06 \x01(\x01\"\x82\x01\n\x15SegmentDiarizeEmotion\x12\n\n\x02id\x18\x01 \x01(\x05\x12\r\n\x05start\x18\x02 \x01(\x01\x12\x0b\n\x03\x65nd\x18\x03 \x01(\x01\x12\x0f\n\x07\x65motion\x18\x04 \x01(\t\x12\x12\n\nspeaker_id\x18\x05 \x01(\t\x12\r\n\x05\x45rror\x18\x06 \x01(\t\x12\r\n\x05score\x18\x07 \x01(\x01\x32\xbe\x02\n\x13\x44\x65\x65pAffectsRealtime\x12_\n\x0fIdentifySpeaker\x12!.deepaffectsrealtime.SegmentChunk\x1a#.deepaffectsrealtime.SegmentSpeaker\"\x00(\x01\x30\x01\x12_\n\x0fIdentifyEmotion\x12!.deepaffectsrealtime.SegmentChunk\x1a#.deepaffectsrealtime.SegmentEmotion\"\x00(\x01\x30\x01\x12\x65\n\x0e\x44iarizeEmotion\x12!.deepaffectsrealtime.SegmentChunk\x1a*.deepaffectsrealtime.SegmentDiarizeEmotion\"\x00(\x01\x30\x01\x42;\n\x1cio.grpc.examples.deepaffectsB\x13\x44\x65\x65paffectsRealtimeP\x01\xa2\x02\x03\x44RIb\x06proto3') + name='deepaffects-realtime.proto', + package='deepaffectsrealtime', + syntax='proto3', + serialized_pb=_b('\n\x1a\x64\x65\x65paffects-realtime.proto\x12\x13\x64\x65\x65paffectsrealtime\"\xb3\x01\n\x0cSegmentChunk\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\x12\x10\n\x08\x65ncoding\x18\x03 \x01(\t\x12\x14\n\x0clanguageCode\x18\x04 \x01(\t\x12\x12\n\nsampleRate\x18\x05 \x01(\x05\x12\x12\n\nspeakerIds\x18\x06 \x03(\t\x12\x15\n\rsegmentOffset\x18\x07 \x01(\x01\x12\x10\n\x08\x64uration\x18\x08 \x01(\x01\x12\r\n\x05\x45rror\x18\t \x01(\t\"y\n\x0eSegmentSpeaker\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x12\n\nspeaker_id\x18\x02 \x01(\t\x12\r\n\x05start\x18\x03 \x01(\x01\x12\x0b\n\x03\x65nd\x18\x04 \x01(\x01\x12\r\n\x05\x45rror\x18\x05 \x01(\t\x12\x1c\n\x14identification_score\x18\x06 \x01(\x02\"o\n\x0eSegmentEmotion\x12\n\n\x02id\x18\x01 \x01(\x05\x12\r\n\x05start\x18\x02 \x01(\x01\x12\x0b\n\x03\x65nd\x18\x03 \x01(\x01\x12\x0f\n\x07\x65motion\x18\x04 \x01(\t\x12\r\n\x05\x45rror\x18\x05 \x01(\t\x12\x15\n\remotion_score\x18\x06 \x01(\x01\"\xa8\x01\n\x15SegmentDiarizeEmotion\x12\n\n\x02id\x18\x01 \x01(\x05\x12\r\n\x05start\x18\x02 \x01(\x01\x12\x0b\n\x03\x65nd\x18\x03 \x01(\x01\x12\x0f\n\x07\x65motion\x18\x04 \x01(\t\x12\x12\n\nspeaker_id\x18\x05 \x01(\t\x12\r\n\x05\x45rror\x18\x06 \x01(\t\x12\x15\n\remotion_score\x18\x07 \x01(\x01\x12\x1c\n\x14identification_score\x18\x08 \x01(\x01\x32\xbe\x02\n\x13\x44\x65\x65pAffectsRealtime\x12_\n\x0fIdentifySpeaker\x12!.deepaffectsrealtime.SegmentChunk\x1a#.deepaffectsrealtime.SegmentSpeaker\"\x00(\x01\x30\x01\x12_\n\x0fIdentifyEmotion\x12!.deepaffectsrealtime.SegmentChunk\x1a#.deepaffectsrealtime.SegmentEmotion\"\x00(\x01\x30\x01\x12\x65\n\x0e\x44iarizeEmotion\x12!.deepaffectsrealtime.SegmentChunk\x1a*.deepaffectsrealtime.SegmentDiarizeEmotion\"\x00(\x01\x30\x01\x42;\n\x1cio.grpc.examples.deepaffectsB\x13\x44\x65\x65paffectsRealtimeP\x01\xa2\x02\x03\x44RIb\x06proto3') ) + + _SEGMENTCHUNK = _descriptor.Descriptor( - name='SegmentChunk', - full_name='deepaffectsrealtime.SegmentChunk', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='id', full_name='deepaffectsrealtime.SegmentChunk.id', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='content', full_name='deepaffectsrealtime.SegmentChunk.content', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='encoding', full_name='deepaffectsrealtime.SegmentChunk.encoding', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='languageCode', full_name='deepaffectsrealtime.SegmentChunk.languageCode', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='sampleRate', full_name='deepaffectsrealtime.SegmentChunk.sampleRate', index=4, - number=5, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='speakerIds', full_name='deepaffectsrealtime.SegmentChunk.speakerIds', index=5, - number=6, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='segmentOffset', full_name='deepaffectsrealtime.SegmentChunk.segmentOffset', index=6, - number=7, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='duration', full_name='deepaffectsrealtime.SegmentChunk.duration', index=7, - number=8, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='Error', full_name='deepaffectsrealtime.SegmentChunk.Error', index=8, - number=9, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=52, - serialized_end=231, + name='SegmentChunk', + full_name='deepaffectsrealtime.SegmentChunk', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='deepaffectsrealtime.SegmentChunk.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='content', full_name='deepaffectsrealtime.SegmentChunk.content', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='encoding', full_name='deepaffectsrealtime.SegmentChunk.encoding', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='languageCode', full_name='deepaffectsrealtime.SegmentChunk.languageCode', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='sampleRate', full_name='deepaffectsrealtime.SegmentChunk.sampleRate', index=4, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='speakerIds', full_name='deepaffectsrealtime.SegmentChunk.speakerIds', index=5, + number=6, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='segmentOffset', full_name='deepaffectsrealtime.SegmentChunk.segmentOffset', index=6, + number=7, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='duration', full_name='deepaffectsrealtime.SegmentChunk.duration', index=7, + number=8, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='Error', full_name='deepaffectsrealtime.SegmentChunk.Error', index=8, + number=9, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=52, + serialized_end=231, ) _SEGMENTSPEAKER = _descriptor.Descriptor( - name='SegmentSpeaker', - full_name='deepaffectsrealtime.SegmentSpeaker', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='id', full_name='deepaffectsrealtime.SegmentSpeaker.id', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='speaker_id', full_name='deepaffectsrealtime.SegmentSpeaker.speaker_id', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='start', full_name='deepaffectsrealtime.SegmentSpeaker.start', index=2, - number=3, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='end', full_name='deepaffectsrealtime.SegmentSpeaker.end', index=3, - number=4, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='Error', full_name='deepaffectsrealtime.SegmentSpeaker.Error', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='score', full_name='deepaffectsrealtime.SegmentSpeaker.score', index=5, - number=6, type=2, cpp_type=6, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=233, - serialized_end=339, + name='SegmentSpeaker', + full_name='deepaffectsrealtime.SegmentSpeaker', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='deepaffectsrealtime.SegmentSpeaker.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='speaker_id', full_name='deepaffectsrealtime.SegmentSpeaker.speaker_id', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='start', full_name='deepaffectsrealtime.SegmentSpeaker.start', index=2, + number=3, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='end', full_name='deepaffectsrealtime.SegmentSpeaker.end', index=3, + number=4, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='Error', full_name='deepaffectsrealtime.SegmentSpeaker.Error', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='identification_score', full_name='deepaffectsrealtime.SegmentSpeaker.identification_score', index=5, + number=6, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=233, + serialized_end=354, ) _SEGMENTEMOTION = _descriptor.Descriptor( - name='SegmentEmotion', - full_name='deepaffectsrealtime.SegmentEmotion', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='id', full_name='deepaffectsrealtime.SegmentEmotion.id', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='start', full_name='deepaffectsrealtime.SegmentEmotion.start', index=1, - number=2, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='end', full_name='deepaffectsrealtime.SegmentEmotion.end', index=2, - number=3, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='emotion', full_name='deepaffectsrealtime.SegmentEmotion.emotion', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='Error', full_name='deepaffectsrealtime.SegmentEmotion.Error', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='score', full_name='deepaffectsrealtime.SegmentEmotion.score', index=5, - number=6, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=341, - serialized_end=444, + name='SegmentEmotion', + full_name='deepaffectsrealtime.SegmentEmotion', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='deepaffectsrealtime.SegmentEmotion.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='start', full_name='deepaffectsrealtime.SegmentEmotion.start', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='end', full_name='deepaffectsrealtime.SegmentEmotion.end', index=2, + number=3, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='emotion', full_name='deepaffectsrealtime.SegmentEmotion.emotion', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='Error', full_name='deepaffectsrealtime.SegmentEmotion.Error', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='emotion_score', full_name='deepaffectsrealtime.SegmentEmotion.emotion_score', index=5, + number=6, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=356, + serialized_end=467, ) _SEGMENTDIARIZEEMOTION = _descriptor.Descriptor( - name='SegmentDiarizeEmotion', - full_name='deepaffectsrealtime.SegmentDiarizeEmotion', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='id', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.id', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='start', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.start', index=1, - number=2, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='end', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.end', index=2, - number=3, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='emotion', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.emotion', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='speaker_id', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.speaker_id', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='Error', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.Error', index=5, - number=6, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='score', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.score', index=6, - number=7, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=447, - serialized_end=577, + name='SegmentDiarizeEmotion', + full_name='deepaffectsrealtime.SegmentDiarizeEmotion', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.id', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='start', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.start', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='end', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.end', index=2, + number=3, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='emotion', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.emotion', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='speaker_id', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.speaker_id', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='Error', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.Error', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='emotion_score', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.emotion_score', index=6, + number=7, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='identification_score', full_name='deepaffectsrealtime.SegmentDiarizeEmotion.identification_score', index=7, + number=8, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=470, + serialized_end=638, ) DESCRIPTOR.message_types_by_name['SegmentChunk'] = _SEGMENTCHUNK @@ -320,75 +330,74 @@ _sym_db.RegisterFileDescriptor(DESCRIPTOR) SegmentChunk = _reflection.GeneratedProtocolMessageType('SegmentChunk', (_message.Message,), dict( - DESCRIPTOR=_SEGMENTCHUNK, - __module__='deepaffects_realtime_pb2' - # @@protoc_insertion_point(class_scope:deepaffectsrealtime.SegmentChunk) -)) + DESCRIPTOR = _SEGMENTCHUNK, + __module__ = 'deepaffects_realtime_pb2' + # @@protoc_insertion_point(class_scope:deepaffectsrealtime.SegmentChunk) + )) _sym_db.RegisterMessage(SegmentChunk) SegmentSpeaker = _reflection.GeneratedProtocolMessageType('SegmentSpeaker', (_message.Message,), dict( - DESCRIPTOR=_SEGMENTSPEAKER, - __module__='deepaffects_realtime_pb2' - # @@protoc_insertion_point(class_scope:deepaffectsrealtime.SegmentSpeaker) -)) + DESCRIPTOR = _SEGMENTSPEAKER, + __module__ = 'deepaffects_realtime_pb2' + # @@protoc_insertion_point(class_scope:deepaffectsrealtime.SegmentSpeaker) + )) _sym_db.RegisterMessage(SegmentSpeaker) SegmentEmotion = _reflection.GeneratedProtocolMessageType('SegmentEmotion', (_message.Message,), dict( - DESCRIPTOR=_SEGMENTEMOTION, - __module__='deepaffects_realtime_pb2' - # @@protoc_insertion_point(class_scope:deepaffectsrealtime.SegmentEmotion) -)) + DESCRIPTOR = _SEGMENTEMOTION, + __module__ = 'deepaffects_realtime_pb2' + # @@protoc_insertion_point(class_scope:deepaffectsrealtime.SegmentEmotion) + )) _sym_db.RegisterMessage(SegmentEmotion) SegmentDiarizeEmotion = _reflection.GeneratedProtocolMessageType('SegmentDiarizeEmotion', (_message.Message,), dict( - DESCRIPTOR=_SEGMENTDIARIZEEMOTION, - __module__='deepaffects_realtime_pb2' - # @@protoc_insertion_point(class_scope:deepaffectsrealtime.SegmentDiarizeEmotion) -)) + DESCRIPTOR = _SEGMENTDIARIZEEMOTION, + __module__ = 'deepaffects_realtime_pb2' + # @@protoc_insertion_point(class_scope:deepaffectsrealtime.SegmentDiarizeEmotion) + )) _sym_db.RegisterMessage(SegmentDiarizeEmotion) DESCRIPTOR.has_options = True -DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b( - '\n\034io.grpc.examples.deepaffectsB\023DeepaffectsRealtimeP\001\242\002\003DRI')) +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\034io.grpc.examples.deepaffectsB\023DeepaffectsRealtimeP\001\242\002\003DRI')) _DEEPAFFECTSREALTIME = _descriptor.ServiceDescriptor( - name='DeepAffectsRealtime', - full_name='deepaffectsrealtime.DeepAffectsRealtime', - file=DESCRIPTOR, + name='DeepAffectsRealtime', + full_name='deepaffectsrealtime.DeepAffectsRealtime', + file=DESCRIPTOR, + index=0, + options=None, + serialized_start=641, + serialized_end=959, + methods=[ + _descriptor.MethodDescriptor( + name='IdentifySpeaker', + full_name='deepaffectsrealtime.DeepAffectsRealtime.IdentifySpeaker', index=0, + containing_service=None, + input_type=_SEGMENTCHUNK, + output_type=_SEGMENTSPEAKER, + options=None, + ), + _descriptor.MethodDescriptor( + name='IdentifyEmotion', + full_name='deepaffectsrealtime.DeepAffectsRealtime.IdentifyEmotion', + index=1, + containing_service=None, + input_type=_SEGMENTCHUNK, + output_type=_SEGMENTEMOTION, + options=None, + ), + _descriptor.MethodDescriptor( + name='DiarizeEmotion', + full_name='deepaffectsrealtime.DeepAffectsRealtime.DiarizeEmotion', + index=2, + containing_service=None, + input_type=_SEGMENTCHUNK, + output_type=_SEGMENTDIARIZEEMOTION, options=None, - serialized_start=580, - serialized_end=898, - methods=[ - _descriptor.MethodDescriptor( - name='IdentifySpeaker', - full_name='deepaffectsrealtime.DeepAffectsRealtime.IdentifySpeaker', - index=0, - containing_service=None, - input_type=_SEGMENTCHUNK, - output_type=_SEGMENTSPEAKER, - options=None, - ), - _descriptor.MethodDescriptor( - name='IdentifyEmotion', - full_name='deepaffectsrealtime.DeepAffectsRealtime.IdentifyEmotion', - index=1, - containing_service=None, - input_type=_SEGMENTCHUNK, - output_type=_SEGMENTEMOTION, - options=None, - ), - _descriptor.MethodDescriptor( - name='DiarizeEmotion', - full_name='deepaffectsrealtime.DeepAffectsRealtime.DiarizeEmotion', - index=2, - containing_service=None, - input_type=_SEGMENTCHUNK, - output_type=_SEGMENTDIARIZEEMOTION, - options=None, - ), - ]) + ), +]) _sym_db.RegisterServiceDescriptor(_DEEPAFFECTSREALTIME) DESCRIPTOR.services_by_name['DeepAffectsRealtime'] = _DEEPAFFECTSREALTIME diff --git a/deepaffects/realtime/deepaffects_realtime_pb2_grpc.py b/deepaffects/realtime/deepaffects_realtime_pb2_grpc.py index ec426fc..6d25999 100644 --- a/deepaffects/realtime/deepaffects_realtime_pb2_grpc.py +++ b/deepaffects/realtime/deepaffects_realtime_pb2_grpc.py @@ -5,79 +5,79 @@ class DeepAffectsRealtimeStub(object): - """Interface exported by the server. - """ + """Interface exported by the server. + """ - def __init__(self, channel): - """Constructor. + def __init__(self, channel): + """Constructor. - Args: - channel: A grpc.Channel. - """ - self.IdentifySpeaker = channel.stream_stream( - '/deepaffectsrealtime.DeepAffectsRealtime/IdentifySpeaker', - request_serializer=deepaffects__realtime__pb2.SegmentChunk.SerializeToString, - response_deserializer=deepaffects__realtime__pb2.SegmentSpeaker.FromString, + Args: + channel: A grpc.Channel. + """ + self.IdentifySpeaker = channel.stream_stream( + '/deepaffectsrealtime.DeepAffectsRealtime/IdentifySpeaker', + request_serializer=deepaffects__realtime__pb2.SegmentChunk.SerializeToString, + response_deserializer=deepaffects__realtime__pb2.SegmentSpeaker.FromString, ) - self.IdentifyEmotion = channel.stream_stream( - '/deepaffectsrealtime.DeepAffectsRealtime/IdentifyEmotion', - request_serializer=deepaffects__realtime__pb2.SegmentChunk.SerializeToString, - response_deserializer=deepaffects__realtime__pb2.SegmentEmotion.FromString, + self.IdentifyEmotion = channel.stream_stream( + '/deepaffectsrealtime.DeepAffectsRealtime/IdentifyEmotion', + request_serializer=deepaffects__realtime__pb2.SegmentChunk.SerializeToString, + response_deserializer=deepaffects__realtime__pb2.SegmentEmotion.FromString, ) - self.DiarizeEmotion = channel.stream_stream( - '/deepaffectsrealtime.DeepAffectsRealtime/DiarizeEmotion', - request_serializer=deepaffects__realtime__pb2.SegmentChunk.SerializeToString, - response_deserializer=deepaffects__realtime__pb2.SegmentDiarizeEmotion.FromString, + self.DiarizeEmotion = channel.stream_stream( + '/deepaffectsrealtime.DeepAffectsRealtime/DiarizeEmotion', + request_serializer=deepaffects__realtime__pb2.SegmentChunk.SerializeToString, + response_deserializer=deepaffects__realtime__pb2.SegmentDiarizeEmotion.FromString, ) class DeepAffectsRealtimeServicer(object): - """Interface exported by the server. - """ + """Interface exported by the server. + """ - def IdentifySpeaker(self, request_iterator, context): - """A Bidirectional streaming RPC. + def IdentifySpeaker(self, request_iterator, context): + """A Bidirectional streaming RPC. - Accepts a stream of SegmentChunk sent while a route is being traversed, - while receiving other SegmentSpeaker (e.g. from other users). - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + Accepts a stream of SegmentChunk sent while a route is being traversed, + while receiving other SegmentSpeaker (e.g. from other users). + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') - def IdentifyEmotion(self, request_iterator, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + def IdentifyEmotion(self, request_iterator, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') - def DiarizeEmotion(self, request_iterator, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + def DiarizeEmotion(self, request_iterator, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') def add_DeepAffectsRealtimeServicer_to_server(servicer, server): - rpc_method_handlers = { - 'IdentifySpeaker': grpc.stream_stream_rpc_method_handler( - servicer.IdentifySpeaker, - request_deserializer=deepaffects__realtime__pb2.SegmentChunk.FromString, - response_serializer=deepaffects__realtime__pb2.SegmentSpeaker.SerializeToString, - ), - 'IdentifyEmotion': grpc.stream_stream_rpc_method_handler( - servicer.IdentifyEmotion, - request_deserializer=deepaffects__realtime__pb2.SegmentChunk.FromString, - response_serializer=deepaffects__realtime__pb2.SegmentEmotion.SerializeToString, - ), - 'DiarizeEmotion': grpc.stream_stream_rpc_method_handler( - servicer.DiarizeEmotion, - request_deserializer=deepaffects__realtime__pb2.SegmentChunk.FromString, - response_serializer=deepaffects__realtime__pb2.SegmentDiarizeEmotion.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'deepaffectsrealtime.DeepAffectsRealtime', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) + rpc_method_handlers = { + 'IdentifySpeaker': grpc.stream_stream_rpc_method_handler( + servicer.IdentifySpeaker, + request_deserializer=deepaffects__realtime__pb2.SegmentChunk.FromString, + response_serializer=deepaffects__realtime__pb2.SegmentSpeaker.SerializeToString, + ), + 'IdentifyEmotion': grpc.stream_stream_rpc_method_handler( + servicer.IdentifyEmotion, + request_deserializer=deepaffects__realtime__pb2.SegmentChunk.FromString, + response_serializer=deepaffects__realtime__pb2.SegmentEmotion.SerializeToString, + ), + 'DiarizeEmotion': grpc.stream_stream_rpc_method_handler( + servicer.DiarizeEmotion, + request_deserializer=deepaffects__realtime__pb2.SegmentChunk.FromString, + response_serializer=deepaffects__realtime__pb2.SegmentDiarizeEmotion.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'deepaffectsrealtime.DeepAffectsRealtime', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) From 2f8c18ac2ae2833ac7111508f54587fd651dcafb Mon Sep 17 00:00:00 2001 From: Sushant Hiray Date: Fri, 23 Nov 2018 20:29:50 +0530 Subject: [PATCH 21/26] Release v1.4.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f218448..a322aa2 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ import os NAME = "deepaffects" -VERSION = "1.3.3" +VERSION = "1.4.0" # To install the library, run the following # # python setup.py install From 5a6f8a6c54f4d722bc1612be809049ffe7dff8ee Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Thu, 29 Nov 2018 22:08:34 +0530 Subject: [PATCH 22/26] Handle chunk none while exporting file --- deepaffects/realtime/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepaffects/realtime/util.py b/deepaffects/realtime/util.py index 0758f1a..7fad2fc 100644 --- a/deepaffects/realtime/util.py +++ b/deepaffects/realtime/util.py @@ -111,7 +111,7 @@ def chunk_generator_from_playlist(out_file_name=None, file_path=None, buffer_siz except Exception as e: print(e) finally: - if download_audio and (out_file_name is not None): + if download_audio and (out_file_name is not None) and (chunk is not None): dir_path = "./output" if not os.path.exists(dir_path): os.makedirs(dir_path) From 0f36c87de2637e4d2bb5d590586b8cc4885ec8ac Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Thu, 29 Nov 2018 23:26:41 +0530 Subject: [PATCH 23/26] Set max message size to hug number --- deepaffects/realtime/util.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deepaffects/realtime/util.py b/deepaffects/realtime/util.py index 7fad2fc..7e47078 100644 --- a/deepaffects/realtime/util.py +++ b/deepaffects/realtime/util.py @@ -20,6 +20,7 @@ import deepaffects.realtime.deepaffects_realtime_pb2 as deepaffects_types from deepaffects.realtime.types import segment_chunk +MAX_MESSAGE_LENGTH = 1000000000 def encode_to_base64(file): with open(file, "rb") as f1: @@ -52,7 +53,7 @@ def pydub_segment_to_base64(chunk,i): def get_deepaffects_client(host_url='realtime.deepaffects.com:80'): - channel = grpc.insecure_channel(host_url) + channel = grpc.insecure_channel(host_url, options=[('grpc.max_send_message_length', MAX_MESSAGE_LENGTH), ('grpc.max_receive_message_length', MAX_MESSAGE_LENGTH)]) stub = deepaffects_grpc.DeepAffectsRealtimeStub(channel) return stub From 3ef297f6e6b53ebb7e8b7bc5d05fa6a2f96d2bc4 Mon Sep 17 00:00:00 2001 From: Vivek Nimkarde Date: Thu, 29 Nov 2018 23:34:59 +0530 Subject: [PATCH 24/26] Fix params order --- deepaffects/realtime/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepaffects/realtime/util.py b/deepaffects/realtime/util.py index 7e47078..ac6ddee 100644 --- a/deepaffects/realtime/util.py +++ b/deepaffects/realtime/util.py @@ -58,7 +58,7 @@ def get_deepaffects_client(host_url='realtime.deepaffects.com:80'): return stub -def chunk_generator_from_playlist(out_file_name=None, file_path=None, buffer_size=30000, download_audio=True): +def chunk_generator_from_playlist(file_path=None, out_file_name=None, buffer_size=30000, download_audio=True): chunk = None try: offset = 0 From 31a340ccf7096fe628eebcf1900ac98cad1886c0 Mon Sep 17 00:00:00 2001 From: Sushant Hiray Date: Fri, 30 Nov 2018 20:16:18 +0530 Subject: [PATCH 25/26] Release v1.4.1 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a322aa2..8dfb393 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ import os NAME = "deepaffects" -VERSION = "1.4.0" +VERSION = "1.4.1" # To install the library, run the following # # python setup.py install From 8c7b3a1427bff4c2ba9623316de5641638cfe3d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 23 May 2019 12:06:24 +0000 Subject: [PATCH 26/26] Bump requests from 2.19.1 to 2.20.0 Bumps [requests](https://github.com/requests/requests) from 2.19.1 to 2.20.0. - [Release notes](https://github.com/requests/requests/releases) - [Changelog](https://github.com/kennethreitz/requests/blob/master/HISTORY.md) - [Commits](https://github.com/requests/requests/compare/v2.19.1...v2.20.0) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 65b6dc9..ae00acc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,4 +9,4 @@ grpcio==1.13.0 protobuf==3.6.0 pytube==9.2.2 m3u8==0.3.6 -requests==2.19.1 \ No newline at end of file +requests==2.20.0 \ No newline at end of file