diff --git a/voice_recognition.py b/voice_recognition.py index 4e90cad..53f9361 100644 --- a/voice_recognition.py +++ b/voice_recognition.py @@ -77,7 +77,6 @@ class WaveWriter: self.queue.put(operation) def writeframes(self, pcmdata): - logger.info(self.transcript_file_present) self.transcript_file_present.writeframes(pcmdata) def cleanup(self): @@ -98,7 +97,7 @@ class SRBuffer(voice_recv.AudioSink): self.wavewriter = {} def on_user_connect(self, username): - self.wavewriter[str(username.id)] = [WaveWriter(username, self.queue), time.time_ns(), False, False] + self.wavewriter[str(username.id)] = [WaveWriter(username, self.queue), time.time_ns(), time.time_ns(), False, False] def on_user_disconnect(self,username): self.wavewriter[str(username.id)].cleanup() @@ -108,12 +107,12 @@ class SRBuffer(voice_recv.AudioSink): return False def write(self, user, data) -> None: - #logger.info("User %s", user) if user: self.wavewriter[str(user.id)][0].writeframes(data.pcm) - self.wavewriter[str(user.id)][1] = time.time_ns() - self.wavewriter[str(user.id)][2] = True + self.wavewriter[str(user.id)][1] = time.time_ns() #time from last write + self.wavewriter[str(user.id)][2] = time.time_ns() #time since last rotation self.wavewriter[str(user.id)][3] = True + self.wavewriter[str(user.id)][4] = True def cleanup(self) -> None: try: @@ -125,9 +124,15 @@ class SRBuffer(voice_recv.AudioSink): class TranscriptionOutput(commands.Cog): - def __init__(self, bot): - pass - + def __init__(self, bot, queue): + self.bot = bot + self.queue = queue + self.work = False + @discord.ext.tasks.loop() + def scan_loop(self): + while self.work: + time.sleep(1.0) + logger.info("Output scan loop exited succesfully") class Transcriber(commands.Cog): def __init__(self, bot): @@ -135,7 +140,7 @@ class Transcriber(commands.Cog): self.threads = [] self.comm_queue = Queue() self.wsink = SRBuffer(self.comm_queue) - + self.output_handler = TranscriptionOutput(self.bot, self.comm_queue) async def transcribe(self,file_url): config = aai.TranscriptionConfig(speaker_labels=True, language_code="pl") @@ -148,6 +153,7 @@ class Transcriber(commands.Cog): async def test(self, ctx): logger.info("Attempt transcribe") vc = None + if self.bot.voice_clients: if isinstance(self.bot.voice_clients[0], voice_recv.VoiceRecvClient): logger.info("Already transcribing") @@ -158,6 +164,9 @@ class Transcriber(commands.Cog): logger.info("Connected") vc = await ctx.author.voice.channel.connect(cls=voice_recv.VoiceRecvClient) logger.info(self.bot.voice_clients) + self.output_handler.work = True + self.output_handler.scan_loop.start() + vc.listen(self.wsink) self.check_data.start() @@ -165,16 +174,17 @@ class Transcriber(commands.Cog): async def check_data(self): for item in self.wsink.wavewriter.values(): logger.info("Item %s", item) - if not item[2]: - timediff = time.time_ns() - item[1] - if timediff > 3000149433 and item[3]: #timeout occured data to transmit exists - logger.info("File rotation at %s", timediff) - item[3] = False #buffer rotated + if not item[3]: + timediff_rotation = time.time_ns() - item[2] + timediff_write = time.time_ns() -item[1] + if timediff_rotation > 3000149433 and timediff_write > 500014943 and item[4]: + logger.info("File rotation time since last write %s", timediff_write/1e9) + logger.info("File rotation time since last rotation %s", timediff_rotation/1e9) + item[4] = False item[0].rotate() #temporary - will be put in separate thread await self.transcribe(item[0].file_name_past) - #ensure only files with minimum length are sent to transcription - item[2] = False + item[4] = False logger.info("Diff : %s", time.time_ns() - item[1]) @tasks.loop(seconds=1) @@ -206,6 +216,8 @@ class Transcriber(commands.Cog): @commands.command(name="stop_transcribe") async def stop(self, ctx): + + self.output_handler.work = False self.check_data.stop() await ctx.voice_client.disconnect()