From 7f57da86f096ba45b4afaa4f2a56f6bac0d04635 Mon Sep 17 00:00:00 2001 From: mtuszowski Date: Wed, 18 Sep 2024 00:24:53 +0200 Subject: [PATCH] fix --- voice_recognition.py | 85 +++++++++++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 28 deletions(-) diff --git a/voice_recognition.py b/voice_recognition.py index 4470412..3724036 100644 --- a/voice_recognition.py +++ b/voice_recognition.py @@ -1,33 +1,54 @@ +import logging +import wave + import assemblyai as aai import discord from discord.ext import commands, voice_recv -import logging from discord.opus import Decoder as OpusDecoder -import wave # Replace with your API key aai.settings.api_key = "aa9962f0088a449a9c4ab2361e96cc08" discord.opus._load_default() - +# VoiceState +# self_mute=False +# self_deaf=False +# self_stream=False +# suppress=False +# requested_to_speak_at=None +# channel= +# user_limit=0 +# category_id=1084451744496496753 # URL of the file to transcribe # You can also transcribe a local file by passing in a file path # FILE_URL = './path/to/file.mWp3 + logger = logging.getLogger("discord") location = "/home/pi/Conjurer/" + + class Events(commands.Cog): def __init__(self, bot): self.bot = bot @commands.Cog.listener() - async def on_voice_state_update(self, before, after, third): - logger.info("self %s", self) - logger.info("before %s", before) - logger.info("after %s", after) - logger.info("third %s", third) + async def on_voice_state_update(self, user, before, after): + if before.channel is None: + logger.info("User %s connected to channel %s", user, after.channel.name) + elif after.channel is None: + logger.info("User %s disconnected from channel %s", user, before.channel.name) + else: + logger.info("User VC status changed %s", user) + logger.info("Before %s", before) + logger.info("After %s", after) -class UserTranscript(): +class UserTranscript: def __init__(self, user_id): self.username = str(user_id) @@ -35,24 +56,34 @@ class UserTranscript(): self.file_name_past = None self.file_name_present = location + self.username + str(self.present_file_id) - self.transcript_file_present = wave.Wave_write = wave.open(self.file_name_present, 'wb') + self.transcript_file_present = wave.Wave_write = wave.open( + self.file_name_present, "wb" + ) + + self.file_name_future = location + self.username + str(self.present_file_id + 1) + self.transcript_file_future = wave.Wave_write = wave.open( + self.file_name_future, "wb" + ) - self.file_name_future = location + self.username + str(self.present_file_id+1) - self.transcript_file_future = wave.Wave_write = wave.open(self.file_name_future, 'wb') def rotate(self): self.transcript_file_present.close() self.name_file_past = self.file_name_present self.present_file_id += 1 self.file_name_present = self.file_name_future self.transcript_file_present = self.transcript_file_future - self.transcript_file_future = location + self.username + str(self.present_file_id+1) - self.transcript_file_future = wave.Wave_write = wave.open(self.file_name_future, 'wb') - #send past to transcription + self.transcript_file_future = ( + location + self.username + str(self.present_file_id + 1) + ) + self.transcript_file_future = wave.Wave_write = wave.open( + self.file_name_future, "wb" + ) + # send past to transcription def cleanup(self): self.transcript_file_present.close() self.transcript_file_future.close() - #send present to transcription + # send present to transcription + class SRBuffer(voice_recv.AudioSink): """Endpoint AudioSink that generates a wav file. @@ -63,14 +94,13 @@ class SRBuffer(voice_recv.AudioSink): SAMPLE_WIDTH = OpusDecoder.SAMPLE_SIZE // OpusDecoder.CHANNELS SAMPLING_RATE = OpusDecoder.SAMPLING_RATE - #on member join dodajemytypa do listy - #on member disconnect - dropujemy go - + # on member join dodajemytypa do listy + # on member disconnect - dropujemy go def __init__(self, destination): super().__init__() - self._file: wave.Wave_write = wave.open(destination, 'wb') + self._file: wave.Wave_write = wave.open(destination, "wb") self._file.setnchannels(self.CHANNELS) self._file.setsampwidth(self.SAMPLE_WIDTH) self._file.setframerate(self.SAMPLING_RATE) @@ -101,12 +131,10 @@ class Transcriber(commands.Cog): config = aai.TranscriptionConfig(speaker_labels=True, language_code="pl") transcriber = aai.Transcriber() - transcript = transcriber.transcribe( - file_url, - config=config - ) + transcript = transcriber.transcribe(file_url, config=config) for utterance in transcript.utterances: - print(f"Speaker {utterance.speaker}: {utterance.text}") + print(f"Speaker {utterance.speaker}: {utterance.text}") + @commands.hybrid_command(name="transcribe") async def test(self, ctx): logger.info("Attempt transcribe") @@ -114,14 +142,15 @@ class Transcriber(commands.Cog): logger.info("Connected") vc.listen(self.wsink) - @commands.command(name="stop_transcribe") async def stop(self, ctx): await ctx.voice_client.disconnect() + async def setup(bot): await bot.add_cog(Transcriber(bot)) await bot.add_cog(Events(bot)) -#1. zapisuj kwestie człowieka do pliku w którym będzie można stwierdzić kto co powiedział (callback z basicaudio + write z wavesinka). Zamykaj plik i wysyłaj do transkrypcji w momencie ciszy dłuższej niż 0.5s. Jeśli człowiek nadaje cały czas dawaj sygnał że nie można go transkrybować - i wyłaczaj zapis. -#2. Transkrypcja to abstrakt - w zależności od tego która metoda jest włączona wysyła do odpowiedniego silnika, silniki offline odpalam na activcomie. Zaczynamy od assemblyai bo najlepiej wspiera polski. Potem zobaczymy co dalej. \ No newline at end of file + +# 1. zapisuj kwestie człowieka do pliku w którym będzie można stwierdzić kto co powiedział (callback z basicaudio + write z wavesinka). Zamykaj plik i wysyłaj do transkrypcji w momencie ciszy dłuższej niż 0.5s. Jeśli człowiek nadaje cały czas dawaj sygnał że nie można go transkrybować - i wyłaczaj zapis. +# 2. Transkrypcja to abstrakt - w zależności od tego która metoda jest włączona wysyła do odpowiedniego silnika, silniki offline odpalam na activcomie. Zaczynamy od assemblyai bo najlepiej wspiera polski. Potem zobaczymy co dalej.