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/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,)) diff --git a/deepaffects/realtime/util.py b/deepaffects/realtime/util.py index e39084c..ac6ddee 100644 --- a/deepaffects/realtime/util.py +++ b/deepaffects/realtime/util.py @@ -1,21 +1,26 @@ 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 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: @@ -28,7 +33,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) @@ -36,22 +41,86 @@ 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 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 -def chunk_generator_from_file(file_path, max_chunk_size=30000, min_chunk_size=3000): +def chunk_generator_from_playlist(file_path=None, out_file_name=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) and (chunk 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 # from deepaffects.realtime.types import segment_chunk @@ -73,57 +142,59 @@ def chunk_generator_from_file(file_path, max_chunk_size=30000, min_chunk_size=30 """ 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) 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 diff --git a/examples/playlist_chunk_generator.py b/examples/playlist_chunk_generator.py index 45de621..ff8bbd6 100644 --- a/examples/playlist_chunk_generator.py +++ b/examples/playlist_chunk_generator.py @@ -1,80 +1,17 @@ -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=3): - 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 = None - chunk_index = 1 - index = 0 - - 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") - chunk_index = chunk_index + 1 - elif chunk_index < buffer_size: - chunk = chunk + AudioSegment.from_file(io.BytesIO(buff), "aac") - chunk_index = chunk_index + 1 - 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) - index = index + 1 - yield audio_segment - chunk_index = 1 - last_processed = m3u8_obj.media_sequence - if m3u8_obj.data['is_endlist']: - 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), ('verbose', verbose) ] 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: diff --git a/examples/ticker_based_earnings_call_identification.py b/examples/ticker_based_earnings_call_identification.py new file mode 100644 index 0000000..8356ac4 --- /dev/null +++ b/examples/ticker_based_earnings_call_identification.py @@ -0,0 +1,54 @@ +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" +ticker = "TICKER_SYMBOL" +out_file_name = "OUT_FILE_NAME" +verbose = "True" + +metadata = [ + ('apikey', apikey), + ('ticker', ticker), + ('verbose', verbose) +] + +# 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. +""" +# DeepAffects realtime Api client +client = get_deepaffects_client() + +responses = client.DiarizeEmotion( + 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: + print("Received message") + print(response) + +"""Response. + response = { + emotion: Emotion identified in the segment, + start: start of the segment, + end: end of the segment + } +""" diff --git a/requirements.txt b/requirements.txt index 3048d34..ae00acc 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.20.0 \ No newline at end of file diff --git a/setup.py b/setup.py index 77ed33f..8dfb393 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ import os NAME = "deepaffects" -VERSION = "1.2.0" +VERSION = "1.4.1" # To install the library, run the following # # python setup.py install @@ -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" )