Spaces:
				
			
			
	
			
			
		Runtime error
		
	
	
	
			
			
	
	
	
	
		
		
		Runtime error
		
	refactor - move ffmpeg_converter_actor to within respond_to_prompt_actor
Browse files- charles_actor.py +7 -14
- respond_to_prompt_actor.py +22 -18
- speech_to_text_vosk_actor.py +1 -1
    	
        charles_actor.py
    CHANGED
    
    | @@ -21,32 +21,25 @@ class CharlesActor: | |
| 21 |  | 
| 22 | 
             
                async def _initalize_resources(self):
         | 
| 23 | 
             
                    # Initialize resources
         | 
| 24 | 
            -
                    print("000")
         | 
| 25 | 
             
                    from streamlit_av_queue import StreamlitAVQueue
         | 
| 26 | 
             
                    self._streamlit_av_queue = StreamlitAVQueue()
         | 
| 27 | 
             
                    self._out_audio_queue = self._streamlit_av_queue.get_out_audio_queue()
         | 
| 28 |  | 
| 29 | 
            -
                    print("001")
         | 
| 30 | 
            -
                    from  | 
| 31 | 
            -
                    self. | 
| 32 | 
            -
                    await self._ffmpeg_converter_actor.start_process.remote()
         | 
| 33 | 
            -
                    self._ffmpeg_converter_actor.run.remote()
         | 
| 34 |  | 
| 35 | 
            -
                    print("002")
         | 
| 36 | 
             
                    from speech_to_text_vosk_actor import SpeechToTextVoskActor
         | 
| 37 | 
             
                    self._speech_to_text_actor = SpeechToTextVoskActor.remote()
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                    print("003")
         | 
| 40 | 
            -
                    from respond_to_prompt_actor import RespondToPromptActor
         | 
| 41 | 
            -
                    self._respond_to_prompt_actor = RespondToPromptActor.remote(self._ffmpeg_converter_actor)
         | 
| 42 |  | 
| 43 | 
             
                    self._debug_queue = [
         | 
| 44 | 
             
                        # "hello, how are you today?",
         | 
| 45 | 
             
                        # "hmm, interesting, tell me more about that.",
         | 
| 46 | 
             
                    ]
         | 
| 47 |  | 
| 48 | 
            -
                    print(" | 
| 49 | 
            -
                    print("creating prototypes")
         | 
| 50 | 
             
                    from prototypes import Prototypes
         | 
| 51 | 
             
                    self._prototypes = Prototypes()
         | 
| 52 | 
             
                    print("010")
         | 
| @@ -85,7 +78,7 @@ class CharlesActor: | |
| 85 | 
             
                        if len(process_speech_to_text_future) > 0:
         | 
| 86 | 
             
                            ready, _ = ray.wait([process_speech_to_text_future[0]], timeout=0)
         | 
| 87 | 
             
                            if ready:
         | 
| 88 | 
            -
                                prompt, speaker_finished = await process_speech_to_text_future[0]
         | 
| 89 | 
             
                                del process_speech_to_text_future[0]
         | 
| 90 |  | 
| 91 | 
             
                                if speaker_finished and len(prompt) > 0:
         | 
|  | |
| 21 |  | 
| 22 | 
             
                async def _initalize_resources(self):
         | 
| 23 | 
             
                    # Initialize resources
         | 
| 24 | 
            +
                    print("000 - create StreamlitAVQueue")
         | 
| 25 | 
             
                    from streamlit_av_queue import StreamlitAVQueue
         | 
| 26 | 
             
                    self._streamlit_av_queue = StreamlitAVQueue()
         | 
| 27 | 
             
                    self._out_audio_queue = self._streamlit_av_queue.get_out_audio_queue()
         | 
| 28 |  | 
| 29 | 
            +
                    print("001 - create RespondToPromptActor")
         | 
| 30 | 
            +
                    from respond_to_prompt_actor import RespondToPromptActor
         | 
| 31 | 
            +
                    self._respond_to_prompt_actor = RespondToPromptActor.remote(self._out_audio_queue)
         | 
|  | |
|  | |
| 32 |  | 
| 33 | 
            +
                    print("002 - create SpeechToTextVoskActor")
         | 
| 34 | 
             
                    from speech_to_text_vosk_actor import SpeechToTextVoskActor
         | 
| 35 | 
             
                    self._speech_to_text_actor = SpeechToTextVoskActor.remote()
         | 
|  | |
|  | |
|  | |
|  | |
| 36 |  | 
| 37 | 
             
                    self._debug_queue = [
         | 
| 38 | 
             
                        # "hello, how are you today?",
         | 
| 39 | 
             
                        # "hmm, interesting, tell me more about that.",
         | 
| 40 | 
             
                    ]
         | 
| 41 |  | 
| 42 | 
            +
                    print("003 - create Prototypes")
         | 
|  | |
| 43 | 
             
                    from prototypes import Prototypes
         | 
| 44 | 
             
                    self._prototypes = Prototypes()
         | 
| 45 | 
             
                    print("010")
         | 
|  | |
| 78 | 
             
                        if len(process_speech_to_text_future) > 0:
         | 
| 79 | 
             
                            ready, _ = ray.wait([process_speech_to_text_future[0]], timeout=0)
         | 
| 80 | 
             
                            if ready:
         | 
| 81 | 
            +
                                prompt, speaker_finished, raw_json = await process_speech_to_text_future[0]
         | 
| 82 | 
             
                                del process_speech_to_text_future[0]
         | 
| 83 |  | 
| 84 | 
             
                                if speaker_finished and len(prompt) > 0:
         | 
    	
        respond_to_prompt_actor.py
    CHANGED
    
    | @@ -60,22 +60,23 @@ class LLMSentanceToSpeechActor: | |
| 60 | 
             
                        await self.output_queue.get_async()
         | 
| 61 |  | 
| 62 |  | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
|  | |
| 69 |  | 
| 70 | 
            -
             | 
| 71 | 
            -
             | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 75 |  | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 |  | 
| 80 | 
             
            @ray.remote
         | 
| 81 | 
             
            class SpeechToConverterActor:
         | 
| @@ -85,6 +86,8 @@ class SpeechToConverterActor: | |
| 85 | 
             
                    self.ffmpeg_converter_actor = ffmpeg_converter_actor
         | 
| 86 |  | 
| 87 | 
             
                async def run(self):
         | 
|  | |
|  | |
| 88 | 
             
                    while True:
         | 
| 89 | 
             
                        audio_chunk = await self.input_queue.get_async()
         | 
| 90 | 
             
                        # print (f"Got audio chunk {len(audio_chunk)}")
         | 
| @@ -97,17 +100,18 @@ class SpeechToConverterActor: | |
| 97 |  | 
| 98 | 
             
            @ray.remote
         | 
| 99 | 
             
            class RespondToPromptActor:
         | 
| 100 | 
            -
                def __init__(self,  | 
| 101 | 
             
                    voice_id="2OviOUQc1JsQRQgNkVBj"
         | 
| 102 | 
             
                    self.prompt_queue = Queue(maxsize=100)
         | 
| 103 | 
             
                    self.llm_sentence_queue = Queue(maxsize=100)
         | 
| 104 | 
             
                    self.speech_chunk_queue = Queue(maxsize=100)
         | 
| 105 | 
            -
             | 
|  | |
| 106 |  | 
| 107 | 
             
                    self.prompt_to_llm = PromptToLLMActor.remote(self.prompt_queue, self.llm_sentence_queue)
         | 
| 108 | 
             
                    self.llm_sentence_to_speech = LLMSentanceToSpeechActor.remote(self.llm_sentence_queue, self.speech_chunk_queue, voice_id)
         | 
| 109 | 
             
                    # self.speech_output = SpeechToSpeakerActor.remote(self.speech_chunk_queue, voice_id)
         | 
| 110 | 
            -
                    self.speech_output = SpeechToConverterActor.remote(self.speech_chunk_queue, ffmpeg_converter_actor)
         | 
| 111 |  | 
| 112 | 
             
                    # Start the pipeline components.
         | 
| 113 | 
             
                    self.prompt_to_llm.run.remote()
         | 
| @@ -119,7 +123,7 @@ class RespondToPromptActor: | |
| 119 | 
             
                    prompt_to_llm_future = self.prompt_to_llm.cancel.remote()
         | 
| 120 | 
             
                    llm_sentence_to_speech_future = self.llm_sentence_to_speech.cancel.remote()
         | 
| 121 | 
             
                    speech_output_future = self.speech_output.cancel.remote()
         | 
| 122 | 
            -
                    ffmpeg_converter_future = self. | 
| 123 | 
             
                    await asyncio.gather(
         | 
| 124 | 
             
                        prompt_to_llm_future,
         | 
| 125 | 
             
                        llm_sentence_to_speech_future,
         | 
|  | |
| 60 | 
             
                        await self.output_queue.get_async()
         | 
| 61 |  | 
| 62 |  | 
| 63 | 
            +
            # legacy code for playing from local speaker
         | 
| 64 | 
            +
            # @ray.remote
         | 
| 65 | 
            +
            # class SpeechToSpeakerActor:
         | 
| 66 | 
            +
            #     def __init__(self, input_queue, voice_id):
         | 
| 67 | 
            +
            #         load_dotenv()
         | 
| 68 | 
            +
            #         self.input_queue = input_queue
         | 
| 69 | 
            +
            #         self.speaker_service = LocalSpeakerService()
         | 
| 70 |  | 
| 71 | 
            +
            #     async def run(self):
         | 
| 72 | 
            +
            #         while True:
         | 
| 73 | 
            +
            #             audio_chunk = await self.input_queue.get_async()
         | 
| 74 | 
            +
            #             # print (f"Got audio chunk {len(audio_chunk)}")
         | 
| 75 | 
            +
            #             self.speaker_service.add_audio_stream([audio_chunk])
         | 
| 76 |  | 
| 77 | 
            +
            #     async def cancel(self):
         | 
| 78 | 
            +
            #         while not self.input_queue.empty():
         | 
| 79 | 
            +
            #             await self.input_queue.get_async()            
         | 
| 80 |  | 
| 81 | 
             
            @ray.remote
         | 
| 82 | 
             
            class SpeechToConverterActor:
         | 
|  | |
| 86 | 
             
                    self.ffmpeg_converter_actor = ffmpeg_converter_actor
         | 
| 87 |  | 
| 88 | 
             
                async def run(self):
         | 
| 89 | 
            +
                    await self.ffmpeg_converter_actor.start_process.remote()
         | 
| 90 | 
            +
                    self.ffmpeg_converter_actor.run.remote()
         | 
| 91 | 
             
                    while True:
         | 
| 92 | 
             
                        audio_chunk = await self.input_queue.get_async()
         | 
| 93 | 
             
                        # print (f"Got audio chunk {len(audio_chunk)}")
         | 
|  | |
| 100 |  | 
| 101 | 
             
            @ray.remote
         | 
| 102 | 
             
            class RespondToPromptActor:
         | 
| 103 | 
            +
                def __init__(self, out_audio_queue):
         | 
| 104 | 
             
                    voice_id="2OviOUQc1JsQRQgNkVBj"
         | 
| 105 | 
             
                    self.prompt_queue = Queue(maxsize=100)
         | 
| 106 | 
             
                    self.llm_sentence_queue = Queue(maxsize=100)
         | 
| 107 | 
             
                    self.speech_chunk_queue = Queue(maxsize=100)
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                    self.ffmpeg_converter_actor = FFMpegConverterActor.remote(out_audio_queue)
         | 
| 110 |  | 
| 111 | 
             
                    self.prompt_to_llm = PromptToLLMActor.remote(self.prompt_queue, self.llm_sentence_queue)
         | 
| 112 | 
             
                    self.llm_sentence_to_speech = LLMSentanceToSpeechActor.remote(self.llm_sentence_queue, self.speech_chunk_queue, voice_id)
         | 
| 113 | 
             
                    # self.speech_output = SpeechToSpeakerActor.remote(self.speech_chunk_queue, voice_id)
         | 
| 114 | 
            +
                    self.speech_output = SpeechToConverterActor.remote(self.speech_chunk_queue, self.ffmpeg_converter_actor)
         | 
| 115 |  | 
| 116 | 
             
                    # Start the pipeline components.
         | 
| 117 | 
             
                    self.prompt_to_llm.run.remote()
         | 
|  | |
| 123 | 
             
                    prompt_to_llm_future = self.prompt_to_llm.cancel.remote()
         | 
| 124 | 
             
                    llm_sentence_to_speech_future = self.llm_sentence_to_speech.cancel.remote()
         | 
| 125 | 
             
                    speech_output_future = self.speech_output.cancel.remote()
         | 
| 126 | 
            +
                    ffmpeg_converter_future = self.ffmpeg_converter_actor.flush_output_queue.remote()
         | 
| 127 | 
             
                    await asyncio.gather(
         | 
| 128 | 
             
                        prompt_to_llm_future,
         | 
| 129 | 
             
                        llm_sentence_to_speech_future,
         | 
    	
        speech_to_text_vosk_actor.py
    CHANGED
    
    | @@ -33,7 +33,7 @@ class SpeechToTextVoskActor: | |
| 33 | 
             
                        result = self.vosk.PartialResult()
         | 
| 34 | 
             
                        result_json = json.loads(result)
         | 
| 35 | 
             
                        text = result_json['partial']
         | 
| 36 | 
            -
                    return text, speaker_finished
         | 
| 37 |  | 
| 38 |  | 
| 39 | 
             
                def add_speech_bytes(self, data: bytearray):
         | 
|  | |
| 33 | 
             
                        result = self.vosk.PartialResult()
         | 
| 34 | 
             
                        result_json = json.loads(result)
         | 
| 35 | 
             
                        text = result_json['partial']
         | 
| 36 | 
            +
                    return text, speaker_finished, result_json
         | 
| 37 |  | 
| 38 |  | 
| 39 | 
             
                def add_speech_bytes(self, data: bytearray):
         | 
