__version__ = (1, 0, 35) # ▄▀█ █▄ █ █▀█ █▄ █ █▀█ ▀▀█ █▀█ █ █ █▀ # █▀█ █ ▀█ █▄█ █ ▀█ ▀▀█ █ ▀▀█ ▀▀█ ▄█ # # © Copyright 2024 # # developed by @anon97945 # # https://t.me/apodiktum_modules # https://github.com/anon97945 # # 🔒 Licensed under the GNU GPLv3 # 🌐 https://www.gnu.org/licenses/gpl-3.0.html # meta developer: @apodiktum_modules # meta banner: https://t.me/apodiktum_dumpster/11 # meta pic: https://t.me/apodiktum_dumpster/13 # scope: ffmpeg # scope: hikka_only # scope: hikka_min 1.3.3 # requires: numpy scipy noisereduce soundfile pyrubberband import asyncio import io import logging import os import noisereduce as nr import numpy as np import pyrubberband import scipy.io.wavfile as wavfile import soundfile from pydub import AudioSegment, effects from telethon.tl.types import Message from .. import loader, utils logger = logging.getLogger(__name__) async def getchattype(message: Message) -> str: if message.is_group: return "supergroup" if message.is_channel else "smallgroup" if message.is_channel: return "channel" if message.is_private: return "private" def represents_nr(nr_lvl: str) -> bool: try: float(nr_lvl) return 0.01 <= float(nr_lvl) <= 1 except ValueError: return False def represents_pitch(pitch_lvl: str) -> bool: try: float(pitch_lvl) return -18 <= float(pitch_lvl) <= 18 except ValueError: return False def represents_speed(s: str) -> bool: try: float(s) return 0.25 <= float(s) <= 3 except ValueError: return False def represents_gain(s: str) -> bool: try: float(s) return -10 <= float(s) <= 10 except ValueError: return False async def audiohandler( bytes_io_file: io.BytesIO, filename: str, file_ext: str, new_file_ext: str, channels: int, codec: str, ) -> tuple: bytes_io_file.seek(0) bytes_io_file.name = filename + file_ext out = filename + new_file_ext if file_ext != new_file_ext: new_fe_nodot = new_file_ext[1:] with open(filename + file_ext, "wb") as f: f.write(bytes_io_file.getbuffer()) bytes_io_file.seek(0) sproc = await asyncio.create_subprocess_shell( f"ffmpeg -y -i {filename + file_ext} -c:a {codec} -f {new_fe_nodot} -ar" f" 48000 -b:a 320k -ac {channels} {out}", stdin=asyncio.subprocess.PIPE, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, ) await sproc.communicate() with open(out, "rb") as f: bytes_io_file = io.BytesIO(f.read()) bytes_io_file.seek(0) _, new_file_ext = os.path.splitext(out) if os.path.exists(out): os.remove(out) if os.path.exists(filename + file_ext): os.remove(filename + file_ext) return bytes_io_file, filename, new_file_ext async def audiopitcher( bytes_io_file: io.BytesIO, filename: str, file_ext: str, pitch_lvl: float, ) -> tuple: bytes_io_file.seek(0) bytes_io_file.name = filename + file_ext format_ext = file_ext[1:] y, sr = soundfile.read(bytes_io_file) y_shift = pyrubberband.pitch_shift(y, sr, pitch_lvl) bytes_io_file.seek(0) soundfile.write(bytes_io_file, y_shift, sr, format=format_ext) bytes_io_file.seek(0) bytes_io_file.name = filename + file_ext return bytes_io_file, filename, file_ext async def audiodenoiser( bytes_io_file: io.BytesIO, filename: str, file_ext: str, nr_lvl: float, ) -> tuple: bytes_io_file.seek(0) bytes_io_file.name = filename + file_ext rate, data = wavfile.read(bytes_io_file) reduced_noise = nr.reduce_noise( y=data, sr=rate, prop_decrease=nr_lvl, stationary=False, ) wavfile.write(bytes_io_file, rate, reduced_noise) filename, file_ext = os.path.splitext(bytes_io_file.name) return bytes_io_file, filename, file_ext async def audionormalizer( bytes_io_file: io.BytesIO, filename: str, file_ext: str, gain: float, ) -> tuple: bytes_io_file.seek(0) bytes_io_file.name = filename + file_ext format_ext = file_ext[1:] rawsound = AudioSegment.from_file(bytes_io_file, format_ext) normalizedsound = effects.normalize(rawsound) normalizedsound = normalizedsound + gain bytes_io_file.seek(0) normalizedsound.export(bytes_io_file, format=format_ext) bytes_io_file.name = filename + file_ext filename, file_ext = os.path.splitext(bytes_io_file.name) return bytes_io_file, filename, file_ext async def audiospeedup( bytes_io_file: io.BytesIO, filename: str, file_ext: str, speed: float, ) -> tuple: bytes_io_file.seek(0) bytes_io_file.name = filename + file_ext format_ext = file_ext[1:] y, sr = soundfile.read(bytes_io_file) y_stretch = pyrubberband.time_stretch(y, sr, speed) bytes_io_file.seek(0) soundfile.write(bytes_io_file, y_stretch, sr, format=format_ext) bytes_io_file.seek(0) bytes_io_file.name = filename + file_ext return bytes_io_file, filename, file_ext async def dalekvoice(bytes_io_file: io.BytesIO, filename: str, file_ext: str) -> tuple: bytes_io_file.seek(0) bytes_io_file.name = filename + file_ext format_ext = file_ext[1:] sound = AudioSegment.from_wav(bytes_io_file) sound = sound.set_channels(2) sound.export(bytes_io_file, format=format_ext) bytes_io_file.seek(0) VB = 0.2 VL = 0.4 H = 4 LOOKUP_SAMPLES = 1024 MOD_F = 50 def diode_lookup(n_samples: int) -> np.ndarray: result = np.zeros((n_samples,)) for i in range(n_samples): v = float(i - float(n_samples) / 2) / (n_samples / 2) v = abs(v) if v < VB: result[i] = 0 elif VB < v <= VL: result[i] = H * ((v - VB) ** 2) / (2 * VL - 2 * VB) else: result[i] = H * v - H * VL + (H * (VL - VB) ** 2) / (2 * VL - 2 * VB) return result rate, data = wavfile.read(bytes_io_file) data = data[:, 1] scaler = np.max(np.abs(data)) data = data.astype(np.float) / scaler n_samples = data.shape[0] d_lookup = diode_lookup(LOOKUP_SAMPLES) diode = Waveshaper(d_lookup) tone = np.arange(n_samples) tone = np.sin(2 * np.pi * tone * MOD_F / rate) tone = tone * 0.5 tone2 = tone.copy() data2 = data.copy() tone = -tone + data2 data = data + tone2 data = diode.transform(data) + diode.transform(-data) tone = diode.transform(tone) + diode.transform(-tone) result = data - tone result /= np.max(np.abs(result)) result *= scaler wavfile.write(bytes_io_file, rate, result.astype(np.int16)) bytes_io_file.name = filename + file_ext filename, file_ext = os.path.splitext(bytes_io_file.name) return bytes_io_file, filename, file_ext class Waveshaper: def __init__(self, curve): self.curve = curve self.n_bins = self.curve.shape[0] def transform(self, samples: int) -> np.ndarray: # normalize to 0 < samples < 2 max_val = np.max(np.abs(samples)) if max_val >= 1.0: result = samples / np.max(np.abs(samples)) + 1.0 else: result = samples + 1.0 result = result * (self.n_bins - 1) / 2 return self.curve[result.astype(np.int)] @loader.tds class ApodiktumVoiceToolsMod(loader.Module): """ Change, pitch, enhance your Voice. Also includes optional automatic modes. """ strings = { "name": "Apo-VoiceTools", "developer": "@anon97945", "_cfg_gain_lvl": "Set the desired volume gain level for auto normalize.", "_cfg_nr_lvl": "Set the desired noisereduction level.", "_cfg_pitch_lvl": "Set the desired pitch level for auto pitch.", "_cfg_speed_lvl": "Set the desired speed level for auto speed.", "audiodenoiser_txt": "[VoiceTools] Background noise is being removed.", "audiohandler_txt": "[VoiceTools] Audio is being transcoded.", "audiovolume_txt": "[VoiceTools] Audiovolume is being changed.", "auto_anon_off": "❌ Anon Voice.", "auto_anon_on": "✅ Anon Voice.", "auto_dalek_off": "❌ Dalek Voice.", "auto_dalek_on": "✅ Dalek Voice.", "auto_gain_off": "❌ Volumegain.", "auto_gain_on": "✅ Volumegain.", "auto_norm_off": "❌ Normalize.", "auto_norm_on": "✅ Normalize.", "auto_nr_off": "❌ NoiseReduction.", "auto_nr_on": "✅ NoiseReduction.", "auto_pitch_off": "❌ Pitching.", "auto_pitch_on": "✅ Pitching.", "auto_speed_off": "❌ Speed.", "auto_speed_on": "✅ Speed.", "current_auto": ( "[VoiceTools] Current AutoVoiceTools in this Chat are:\n\n{}" ), "dalek_start": "[VoiceTools] Auto DalekVoice activated.", "dalek_stopped": "[VoiceTools] Auto DalekVoice deactivated.", "dalekvoice_txt": "[VoiceTools] Dalek Voice is being applied.", "downloading": "[VoiceTools] Message is being downloaded...", "error_file": "[VoiceTools] No file in the reply detected.", "gain_start": "[VoiceTools] Auto VolumeGain activated.", "gain_stopped": "[VoiceTools] Auto VolumeGain deactivated.", "makewaves_txt": "[VoiceTools] Speech waves are being applied.", "no_nr": ( "[VoiceTools] Your input was an unsupported noise reduction level." ), "no_pitch": "[VoiceTools] Your input was an unsupported pitch level.", "no_speed": "[VoiceTools] Your input was an unsupported speed level.", "norm_start": "[VoiceTools] Auto VoiceNormalizer activated.", "norm_stopped": "[VoiceTools] Auto VoiceNormalizer deactivated.", "nr_level": "[VoiceTools] Noise reduction level set to {}.", "nr_start": "[VoiceTools] Auto VoiceEnhancer activated.", "nr_stopped": "[VoiceTools] Auto VoiceEnhancer deactivated.", "pitch_level": "[VoiceTools] Pitch level set to {}.", "pitch_start": "[VoiceTools] Auto VoicePitch activated.", "pitch_stopped": "[VoiceTools] Auto VoicePitch deactivated.", "pitch_txt": "[VoiceTools] Pitch is being applied.", "speed_start": "[VoiceTools] Auto VoiceSpeed activated.", "speed_stopped": "[VoiceTools] Auto VoiceSpeed deactivated.", "speed_txt": "[VoiceTools] Speed is being applied.", "uploading": "[VoiceTools] File is uploading.", "vcanon_start": "[VoiceTools] Auto AnonVoice activated.", "vcanon_stopped": "[VoiceTools] Auto AnonVoice deactivated.", "vtauto_stopped": "[VoiceTools] Auto Voice Tools deactivated.", "_cfg_cst_auto_migrate": "Wheather to auto migrate defined changes on startup.", } strings_en = {} strings_de = { "_cfg_gain_lvl": ( "Stellen Sie den gewünschten Lautstärkepegel für die automatische" " Normalisierung ein." ), "_cfg_nr_lvl": "Stellen Sie den gewünschten Rauschunterdrückungspegel ein.", "_cfg_pitch_lvl": ( "Stellen Sie den gewünschten Tonhöhenpegel für die automatische" " Tonhöheneinstellung ein." ), "_cfg_speed_lvl": ( "Stellen Sie die gewünschte Geschwindigkeitsstufe für die" " automatische Geschwindigkeit ein." ), "_cmd_doc_cvoicetoolscmd": ( "Dadurch wird die Konfiguration für das Modul geöffnet." ), "audiodenoiser_txt": ( "[VoiceTools] Die Hintergrundgeräusche werden entfernt." ), "audiohandler_txt": "[VoiceTools] Der Ton wird transkodiert.", "audiovolume_txt": "[VoiceTools] Das Audiovolumen wird angepasst.", "auto_anon_off": "❌ Anon Voice.", "auto_anon_on": "✅ Anon Voice.", "auto_dalek_off": "❌ Dalek Voice.", "auto_dalek_on": "✅ Dalek Voice.", "auto_gain_off": "❌ Volumegain.", "auto_gain_on": "✅ Volumegain.", "auto_norm_off": "❌ Normalize.", "auto_norm_on": "✅ Normalize.", "auto_nr_off": "❌ NoiseReduction.", "auto_nr_on": "✅ NoiseReduction.", "auto_pitch_off": "❌ Pitching.", "auto_pitch_on": "✅ Pitching.", "auto_speed_off": "❌ Speed.", "auto_speed_on": "✅ Speed.", "current_auto": ( "[VoiceTools] Aktuelle AutoVoiceTools in diesem Chat sind:\n\n{}" ), "dalek_start": "[VoiceTools] Auto DalekVoice aktiviert.", "dalek_stopped": "[VoiceTools] Auto DalekVoice ist deaktiviert.", "dalekvoice_txt": "[VoiceTools] Die Dalek-Stimme wird angewendet.", "downloading": "[VoiceTools] Die Nachricht wird heruntergeladen...", "error_file": "[VoiceTools] Keine Datei in der Antwort gefunden.", "gain_start": "[VoiceTools] Auto VolumeGain aktiviert.", "gain_stopped": "[VoiceTools] Auto VolumeGain deaktiviert.", "makewaves_txt": "[VoiceTools] Es werden Sprachwellen erstellt.", "no_nr": ( "[VoiceTools] Ihre Eingabe war ein nicht unterstützter" " Rauschunterdrückungspegel." ), "no_pitch": ( "[VoiceTools] Ihre Eingabe war ein nicht unterstützter" " Tonhöhenpegel." ), "no_speed": ( "[VoiceTools] Ihre Eingabe war eine nicht unterstützte" " Geschwindigkeitswert." ), "norm_start": "[VoiceTools] Auto VoiceNormalizer aktiviert.", "norm_stopped": "[VoiceTools] Auto VoiceNormalizer deaktiviert.", "nr_level": "[VoiceTools] Rauschunterdrückungspegel auf {} eingestellt.", "nr_start": "[VoiceTools] Auto VoiceEnhancer aktiviert.", "nr_stopped": "[VoiceTools] Auto VoiceEnhancer deaktiviert.", "pitch_level": "[VoiceTools] Die Tonhöhe ist auf {} eingestellt.", "pitch_start": "[VoiceTools] Auto VoicePitch aktiviert.", "pitch_stopped": "[VoiceTools] Auto VoicePitch deaktiviert.", "pitch_txt": "[VoiceTools] Pitch wird angewandt.", "speed_start": "[VoiceTools] Auto VoiceSpeed aktiviert.", "speed_stopped": "[VoiceTools] Auto VoiceSpeed deaktiviert.", "speed_txt": "[VoiceTools] Geschwindigkeit wird angewendet.", "uploading": "[VoiceTools] Datei wird hochgeladen.", "vcanon_start": "[VoiceTools] Auto AnonVoice aktiviert.", "vcanon_stopped": "[VoiceTools] Auto AnonVoice deaktiviert.", "vtauto_stopped": "[VoiceTools] Auto Voice Tools deaktiviert.", } strings_ru = { "_cfg_gain_lvl": ( "Установите желаемый уровень усиления громкости для автоматического" " питча. (Высоты тона)" ), "_cfg_nr_lvl": "Установите желаемый уровень шумоподавления.", "_cfg_pitch_lvl": "Установите желаемый уровень высоты тона для автонастройки.", "_cfg_speed_lvl": ( "Установите желаемый уровень скорости для автоматической скорости." ), "_cmd_doc_cvoicetoolscmd": "Это откроет конфиг для модуля.", "audiodenoiser_txt": "[VoiceTools] Фоновый шум удаляется.", "audiohandler_txt": "[VoiceTools] Аудио перекодируется.", "audiovolume_txt": "[VoiceTools] Аудиогромкость изменяется.", "auto_anon_off": "❌ Anon Voice.", "auto_anon_on": "✅ Anon Voice.", "auto_dalek_off": "❌ Dalek Voice.", "auto_dalek_on": "✅ Dalek Voice.", "auto_gain_off": "❌ Volumegain.", "auto_gain_on": "✅ Volumegain.", "auto_norm_off": "❌ Normalize.", "auto_norm_on": "✅ Normalize.", "auto_nr_off": "❌ NoiseReduction.", "auto_nr_on": "✅ NoiseReduction.", "auto_pitch_off": "❌ Pitching.", "auto_pitch_on": "✅ Pitching.", "auto_speed_off": "❌ Speed.", "auto_speed_on": "✅ Speed.", "current_auto": ( "[VoiceTools] Текущие авто-инструменты для работы с голосом" " в этом чате:\n\n{}" ), "dalek_start": "[VoiceTools] Активирован автоматический голос «Далека».", "dalek_stopped": ( "[VoiceTools] Деактивирован автоматический голос «Далека»." ), "dalekvoice_txt": "[VoiceTools] Голос «Далека» применяется.", "downloading": "[VoiceTools] Сообщение загружается...", "error_file": "[VoiceTools] Не обнаружен файл в реплае.", "gain_start": ( "[VoiceTools] Активировано автоматическое усиление громкости." ), "gain_stopped": ( "[VoiceTools] Деактивировано автоматическое усиление громкости." ), "makewaves_txt": "[VoiceTools] Речевые волны применяются.", "no_nr": ( "[VoiceTools] Введенное значение не является поддерживаемым уровнем" " шумоподавления." ), "no_pitch": ( "[VoiceTools] Введенное значение не является поддерживаемым уровнем" " высоты тона." ), "no_speed": ( "[VoiceTools] Введенное значение не является поддерживаемым уровнем" " скорости звука." ), "norm_start": "[VoiceTools] Активирована автонормализация голоса.", "norm_stopped": "[VoiceTools] Деактивирована автонормализация голоса.", "nr_level": "[VoiceTools] Уровень шумоподавления установлен на {}.", "nr_start": "[VoiceTools] Активировано автоматическое усиление голоса.", "nr_stopped": ( "[VoiceTools] Деактивировано автоматическое усиление голоса." ), "pitch_level": "[VoiceTools] Уровень высоты тона установлен на {}.", "pitch_start": "[VoiceTools] Активирован авто-питч. (Высота тона)", "pitch_stopped": "[VoiceTools] Деактивирован авто-питч. (Высота тона)", "pitch_txt": "[VoiceTools] Высота тона применяется.", "speed_start": "[VoiceTools] Активировано автоускорение голоса.", "speed_stopped": "[VoiceTools] Деактивировано автоускорение голоса.", "speed_txt": "[VoiceTools] Скорость применяется.", "uploading": "[VoiceTools] Файл загружается.", "vcanon_start": ( "[VoiceTools] Активирован автоматический «анонимный голос»" ), "vcanon_stopped": ( "[VoiceTools] Деактивирован автоматический «анонимный голос»" ), "vtauto_stopped": ( "[VoiceTools] Деактивированы все автоматические инструменты" " для работы с голосом." ), } all_strings = { "strings": strings, "strings_en": strings, "strings_de": strings_de, "strings_ru": strings_ru, } changes = { "migration1": { "name": { "old": "Apo Voicetools", "new": "Apo-Voicetools", }, }, } def __init__(self): self._ratelimit = [] self.config = loader.ModuleConfig( loader.ConfigValue( "pitch_lvl", "4", doc=lambda: self.strings("_cfg_pitch_lvl"), validator=loader.validators.Float(minimum=-18, maximum=18), ), loader.ConfigValue( "nr_lvl", "0.85", doc=lambda: self.strings("_cfg_nr_lvl"), validator=loader.validators.Float(minimum=0.01, maximum=1), ), loader.ConfigValue( "gain_lvl", "1.5", doc=lambda: self.strings("_cfg_gain_lvl"), validator=loader.validators.Float(minimum=-10, maximum=10), ), loader.ConfigValue( "speed_lvl", "1", doc=lambda: self.strings("_cfg_speed_lvl"), validator=loader.validators.Float(minimum=0.25, maximum=3), ), loader.ConfigValue( "auto_migrate", True, doc=lambda: self.strings("_cfg_cst_auto_migrate"), validator=loader.validators.Boolean(), ), # for MigratorClass ) async def client_ready(self): self._classname = self.__class__.__name__ self.apo_lib = await self.import_lib( "https://raw.githubusercontent.com/anon97945/hikka-libs/master/apodiktum_library.py", suspend_on_error=True, ) await self.apo_lib.migrator.auto_migrate_handler( self.__class__.__name__, self.strings("name"), self.changes, self.config["auto_migrate"], ) async def cvoicetoolscmd(self, message: Message): """ This will open the config for the module. """ name = self.strings("name") await self.allmodules.commands["config"]( await utils.answer(message, f"{self.get_prefix()}config {name}") ) async def vtdalekcmd(self, message): """reply to a file to change the voice""" chatid = utils.get_chat_id(message) SendAsVoice = False if not message.is_reply: return replymsg = await message.get_reply_message() SendAsVoice = bool(replymsg.voice) if not replymsg.media: return await utils.answer( message, self.apo_lib.utils.get_str("error_file", self.all_strings, message), ) filename = replymsg.file.name or "voice" ext = replymsg.file.ext if ext == ".oga": filename_new = filename.replace(ext, "") filename_new = filename.replace(".ogg", "") else: filename_new = filename.replace(ext, "") gain_lvl = 0 nr_lvl = self.config["nr_lvl"] file = io.BytesIO() file.name = replymsg.file.name inline_msg = await self.inline.form( message=message, text=self.apo_lib.utils.get_str("downloading", self.all_strings, message), reply_markup={"text": "\u0020\u2800", "callback": "empty"}, ) await self._client.download_file(replymsg, file) file.name = filename_new + ext filename, file_ext = os.path.splitext(file.name) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiohandler_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".wav", "1", "pcm_s16le" ) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiodenoiser_txt", self.all_strings, message), ) file, filename, file_ext = await audiodenoiser(file, filename, file_ext, nr_lvl) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiovolume_txt", self.all_strings, message), ) file, filename, file_ext = await audionormalizer( file, filename, file_ext, gain_lvl ) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("dalekvoice_txt", self.all_strings, message), ) file, filename, file_ext = await dalekvoice(file, filename, file_ext) file.seek(0) if SendAsVoice: inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("makewaves_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".ogg", "2", "libopus" ) else: inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str( "audiohandler_txt", self.all_strings, message ), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ext, "1", "libmp3lame" ) file.seek(0) file.name = filename + file_ext inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("uploading", self.all_strings, message), ) await self._client.send_file(chatid, file, voice_note=SendAsVoice) await inline_msg.delete() async def vtanoncmd(self, message): """reply to a file to change the voice into anonymous""" chatid = utils.get_chat_id(message) SendAsVoice = False if not message.is_reply: return replymsg = await message.get_reply_message() SendAsVoice = bool(replymsg.voice) if not replymsg.media: return await utils.answer( message, self.apo_lib.utils.get_str("error_file", self.all_strings, message), ) filename = replymsg.file.name or "voice" ext = replymsg.file.ext if ext == ".oga": filename_new = filename.replace(ext, "") filename_new = filename.replace(".ogg", "") else: filename_new = filename.replace(ext, "") gain_lvl = 0 file = io.BytesIO() file.name = replymsg.file.name nr_lvl = 0.8 pitch_lvl = -4.5 inline_msg = await self.inline.form( message=message, text=self.apo_lib.utils.get_str("downloading", self.all_strings, message), reply_markup={"text": "\u0020\u2800", "callback": "empty"}, ) await self._client.download_file(replymsg, file) file.name = filename_new + ext filename, file_ext = os.path.splitext(file.name) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiohandler_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".wav", "1", "pcm_s16le" ) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiodenoiser_txt", self.all_strings, message), ) file, filename, file_ext = await audiodenoiser(file, filename, file_ext, nr_lvl) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiovolume_txt", self.all_strings, message), ) file, filename, file_ext = await audionormalizer( file, filename, file_ext, gain_lvl ) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("dalekvoice_txt", self.all_strings, message), ) file, filename, file_ext = await dalekvoice(file, filename, file_ext) file.seek(0) file, filename, file_ext = await audiopitcher( file, filename, file_ext, pitch_lvl ) file.seek(0) if SendAsVoice: inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("makewaves_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".ogg", "2", "libopus" ) else: inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str( "audiohandler_txt", self.all_strings, message ), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ext, "1", "libmp3lame" ) file.seek(0) file.name = filename + file_ext inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("uploading", self.all_strings, message), ) await self._client.send_file(chatid, file, voice_note=SendAsVoice) await inline_msg.delete() async def vtpitchcmd(self, message): """reply to a file to pitch voice - Example: .vtpitch 12 Possible values between -18 and 18""" chatid = utils.get_chat_id(message) SendAsVoice = False if not message.is_reply: return replymsg = await message.get_reply_message() SendAsVoice = bool(replymsg.voice) if not replymsg.media: return await utils.answer( message, self.apo_lib.utils.get_str("error_file", self.all_strings, message), ) pitch_lvl = utils.get_args_raw(message) if not represents_pitch(pitch_lvl): return await utils.answer( message, self.apo_lib.utils.get_str("no_pitch", self.all_strings, message), ) filename = replymsg.file.name or "voice" ext = replymsg.file.ext if ext == ".oga": filename_new = filename.replace(ext, "") filename_new = filename.replace(".ogg", "") else: filename_new = filename.replace(ext, "") gain_lvl = 0 file = io.BytesIO() file.name = replymsg.file.name inline_msg = await self.inline.form( message=message, text=self.apo_lib.utils.get_str("downloading", self.all_strings, message), reply_markup={"text": "\u0020\u2800", "callback": "empty"}, ) await self._client.download_file(replymsg, file) file.name = filename_new + ext filename, file_ext = os.path.splitext(file.name) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiohandler_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".mp3", "1", "libmp3lame" ) file.seek(0) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".flac", "1", "flac" ) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("pitch_txt", self.all_strings, message), ) file, filename, file_ext = await audiopitcher( file, filename, file_ext, float(pitch_lvl) ) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiovolume_txt", self.all_strings, message), ) file, filename, file_ext = await audionormalizer( file, filename, file_ext, gain_lvl ) file.seek(0) if SendAsVoice: inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("makewaves_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".ogg", "2", "libopus" ) else: inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str( "audiohandler_txt", self.all_strings, message ), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ext, "1", "libmp3lame" ) file.seek(0) file.name = filename + file_ext inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("uploading", self.all_strings, message), ) await self._client.send_file(chatid, file, voice_note=SendAsVoice) await inline_msg.delete() async def vtspeedcmd(self, message): """reply to a file to increase speed and reduce length - Example: .vtspeed 1.5 Possible values between 0.25 - 3""" chatid = utils.get_chat_id(message) SendAsVoice = False if not message.is_reply: return replymsg = await message.get_reply_message() SendAsVoice = bool(replymsg.voice) if not replymsg.media: return await utils.answer( message, self.apo_lib.utils.get_str("error_file", self.all_strings, message), ) speed_lvl = utils.get_args_raw(message) if not represents_speed(speed_lvl): return await utils.answer( message, self.apo_lib.utils.get_str("no_speed", self.all_strings, message), ) filename = replymsg.file.name or "voice" ext = replymsg.file.ext if ext == ".oga": filename_new = filename.replace(ext, "") filename_new = filename.replace(".ogg", "") else: filename_new = filename.replace(ext, "") gain_lvl = 0 file = io.BytesIO() file.name = replymsg.file.name inline_msg = await self.inline.form( message=message, text=self.apo_lib.utils.get_str("downloading", self.all_strings, message), reply_markup={"text": "\u0020\u2800", "callback": "empty"}, ) await self._client.download_file(replymsg, file) file.name = filename_new + ext filename, file_ext = os.path.splitext(file.name) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiohandler_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".mp3", "1", "libmp3lame" ) file.seek(0) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".flac", "1", "flac" ) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("speed_txt", self.all_strings, message), ) file, filename, file_ext = await audiospeedup( file, filename, file_ext, float(speed_lvl) ) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiovolume_txt", self.all_strings, message), ) file, filename, file_ext = await audionormalizer( file, filename, file_ext, gain_lvl ) file.seek(0) if SendAsVoice: inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("makewaves_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".ogg", "2", "libopus" ) else: inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str( "audiohandler_txt", self.all_strings, message ), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ext, "1", "libmp3lame" ) file.seek(0) file.name = filename + file_ext inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("uploading", self.all_strings, message), ) await self._client.send_file(chatid, file, voice_note=SendAsVoice) await inline_msg.delete() async def vtgaincmd(self, message): """reply to a file to change the volume - Example: .vtgain 1 Possible values between -10 - 10""" chatid = utils.get_chat_id(message) SendAsVoice = False if not message.is_reply: return replymsg = await message.get_reply_message() SendAsVoice = bool(replymsg.voice) if not replymsg.media: return await utils.answer( message, self.apo_lib.utils.get_str("error_file", self.all_strings, message), ) gain_lvl = utils.get_args_raw(message) if not represents_gain(gain_lvl): return await utils.answer( message, self.apo_lib.utils.get_str("no_speed", self.all_strings, message), ) filename = replymsg.file.name or "voice" ext = replymsg.file.ext if ext == ".oga": filename_new = filename.replace(ext, "") filename_new = filename.replace(".ogg", "") else: filename_new = filename.replace(ext, "") file = io.BytesIO() file.name = replymsg.file.name inline_msg = await self.inline.form( message=message, text=self.apo_lib.utils.get_str("downloading", self.all_strings, message), reply_markup={"text": "\u0020\u2800", "callback": "empty"}, ) await self._client.download_file(replymsg, file) file.name = filename_new + ext filename, file_ext = os.path.splitext(file.name) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiohandler_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".mp3", "1", "libmp3lame" ) file.seek(0) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".flac", "1", "flac" ) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiovolume_txt", self.all_strings, message), ) file, filename, file_ext = await audionormalizer( file, filename, file_ext, gain_lvl ) file.seek(0) if SendAsVoice: inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("makewaves_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".ogg", "2", "libopus" ) else: inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str( "audiohandler_txt", self.all_strings, message ), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ext, "1", "libmp3lame" ) file.seek(0) file.name = filename + file_ext inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("uploading", self.all_strings, message), ) await self._client.send_file(chatid, file, voice_note=SendAsVoice) await inline_msg.delete() async def vtenhcmd(self, message): """reply to a file to enhance voice quality with - Volume normalize - Background NoiseReduce (set your noisereduce level before)""" chatid = utils.get_chat_id(message) SendAsVoice = False if not message.is_reply: return replymsg = await message.get_reply_message() SendAsVoice = bool(replymsg.voice) if not replymsg.media: return await utils.answer( message, self.apo_lib.utils.get_str("error_file", self.all_strings, message), ) nr_lvl = self.config["nr_lvl"] gain_lvl = 0 filename = replymsg.file.name or "voice" ext = replymsg.file.ext if ext == ".oga": filename_new = filename.replace(ext, "") filename_new = filename.replace(".ogg", "") else: filename_new = filename.replace(ext, "") file = io.BytesIO() file.name = replymsg.file.name inline_msg = await self.inline.form( message=message, text=self.apo_lib.utils.get_str("downloading", self.all_strings, message), reply_markup={"text": "\u0020\u2800", "callback": "empty"}, ) await self._client.download_file(replymsg, file) file.name = filename_new + ext filename, file_ext = os.path.splitext(file.name) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiohandler_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".mp3", "1", "libmp3lame" ) file.seek(0) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".wav", "1", "pcm_s16le" ) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiodenoiser_txt", self.all_strings, message), ) file, filename, file_ext = await audiodenoiser(file, filename, file_ext, nr_lvl) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiovolume_txt", self.all_strings, message), ) file, filename, file_ext = await audionormalizer( file, filename, file_ext, gain_lvl ) file.seek(0) if SendAsVoice: inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("makewaves_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".ogg", "2", "libopus" ) else: inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str( "audiohandler_txt", self.all_strings, message ), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ext, "1", "libmp3lame" ) file.seek(0) file.name = filename + file_ext inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("uploading", self.all_strings, message), ) await self._client.send_file(chatid, file, voice_note=SendAsVoice) await inline_msg.delete() async def vtnormcmd(self, message): """reply to a file to normalize volume""" chatid = utils.get_chat_id(message) SendAsVoice = False if not message.is_reply: return replymsg = await message.get_reply_message() SendAsVoice = bool(replymsg.voice) if not replymsg.media: return await utils.answer( message, self.apo_lib.utils.get_str("error_file", self.all_strings, message), ) filename = replymsg.file.name or "voice" ext = replymsg.file.ext if ext == ".oga": filename_new = filename.replace(ext, "") filename_new = filename.replace(".ogg", "") else: filename_new = filename.replace(ext, "") gain_lvl = 0 file = io.BytesIO() file.name = replymsg.file.name inline_msg = await self.inline.form( message=message, text=self.apo_lib.utils.get_str("downloading", self.all_strings, message), reply_markup={"text": "\u0020\u2800", "callback": "empty"}, ) await self._client.download_file(replymsg, file) file.name = filename_new + ext filename, file_ext = os.path.splitext(file.name) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiohandler_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".mp3", "1", "libmp3lame" ) file.seek(0) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".wav", "1", "pcm_s16le" ) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiovolume_txt", self.all_strings, message), ) file, filename, file_ext = await audionormalizer( file, filename, file_ext, gain_lvl ) file.seek(0) if SendAsVoice: inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("makewaves_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".ogg", "2", "libopus" ) else: inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str( "audiohandler_txt", self.all_strings, message ), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ext, "1", "libmp3lame" ) file.seek(0) file.name = filename + file_ext inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("uploading", self.all_strings, message), ) await self._client.send_file(chatid, file, voice_note=SendAsVoice) await inline_msg.delete() async def vtmp3cmd(self, message: Message): """reply to a file to convert it to mp3""" chatid = utils.get_chat_id(message) if not message.is_reply: return replymsg = await message.get_reply_message() if not replymsg.media: return await utils.answer( message, self.apo_lib.utils.get_str("error_file", self.all_strings, message), ) filename = replymsg.file.name or "voice" ext = replymsg.file.ext if ext == ".oga": filename_new = filename.replace(ext, "") filename_new = filename.replace(".ogg", "") else: filename_new = filename.replace(ext, "") file = io.BytesIO() file.name = replymsg.file.name inline_msg = await self.inline.form( message=message, text=self.apo_lib.utils.get_str("downloading", self.all_strings, message), reply_markup={"text": "\u0020\u2800", "callback": "empty"}, ) await self._client.download_file(replymsg, file) file.name = filename_new + ext filename, file_ext = os.path.splitext(file.name) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("audiohandler_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".mp3", "1", "libmp3lame" ) file.seek(0) file.name = filename + file_ext inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("uploading", self.all_strings, message), ) await self._client.send_file(chatid, file, voice_note=False) await inline_msg.delete() async def vtspeechcmd(self, message): """reply to a file to convert it to speech""" chatid = utils.get_chat_id(message) if not message.is_reply: return replymsg = await message.get_reply_message() if not replymsg.media: return await utils.answer( message, self.apo_lib.utils.get_str("error_file", self.all_strings, message), ) filename = replymsg.file.name or "voice" ext = replymsg.file.ext if ext == ".oga": filename_new = filename.replace(ext, "") filename_new = filename.replace(".ogg", "") else: filename_new = filename.replace(ext, "") file = io.BytesIO() file.name = replymsg.file.name inline_msg = await self.inline.form( message=message, text=self.apo_lib.utils.get_str("downloading", self.all_strings, message), reply_markup={"text": "\u0020\u2800", "callback": "empty"}, ) await self._client.download_file(replymsg, file) file.name = filename_new + ext filename, file_ext = os.path.splitext(file.name) file.seek(0) inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("makewaves_txt", self.all_strings, message), ) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".ogg", "2", "libopus" ) file.seek(0) file.name = filename + file_ext inline_msg = await utils.answer( inline_msg, self.apo_lib.utils.get_str("uploading", self.all_strings, message), ) await self._client.send_file(chatid, file, voice_note=True) await inline_msg.delete() async def vtautodalekcmd(self, message): """Turns on AutoDalekVoice for your own Voicemessages in the chat""" dalek_chats = self._db.get(self._classname, "dalek_watcher", []) chatid = utils.get_chat_id(message) chatid_str = str(chatid) if chatid_str not in dalek_chats: dalek_chats.append(chatid_str) self._db.set(self._classname, "dalek_watcher", dalek_chats) await utils.answer( message, self.apo_lib.utils.get_str("dalek_start", self.all_strings, message), ) else: dalek_chats.remove(chatid_str) self._db.set(self._classname, "dalek_watcher", dalek_chats) await utils.answer( message, self.apo_lib.utils.get_str("dalek_stopped", self.all_strings, message), ) async def vtautoanoncmd(self, message): """Turns on AutoAnonVoice for your own Voicemessages in the chat""" vcanon_chats = self._db.get(self._classname, "vcanon_watcher", []) chatid = utils.get_chat_id(message) chatid_str = str(chatid) if chatid_str not in vcanon_chats: vcanon_chats.append(chatid_str) self._db.set(self._classname, "vcanon_watcher", vcanon_chats) await utils.answer( message, self.apo_lib.utils.get_str("vcanon_start", self.all_strings, message), ) else: vcanon_chats.remove(chatid_str) self._db.set(self._classname, "vcanon_watcher", vcanon_chats) await utils.answer( message, self.apo_lib.utils.get_str("vcanon_stopped", self.all_strings, message), ) async def vtautonrcmd(self, message): """Turns on AutoNoiseReduce for your own Voicemessages in the chat""" nr_chats = self._db.get(self._classname, "nr_watcher", []) chatid = utils.get_chat_id(message) chatid_str = str(chatid) if chatid_str not in nr_chats: nr_chats.append(chatid_str) self._db.set(self._classname, "nr_watcher", nr_chats) await utils.answer( message, self.apo_lib.utils.get_str("nr_start", self.all_strings, message), ) else: nr_chats.remove(chatid_str) self._db.set(self._classname, "nr_watcher", nr_chats) await utils.answer( message, self.apo_lib.utils.get_str("nr_stopped", self.all_strings, message), ) async def vtautonormcmd(self, message): """Turns on AutoVoiceNormalizer for your own Voicemessages in the chat""" norm_chats = self._db.get(self._classname, "norm_watcher", []) chatid = utils.get_chat_id(message) chatid_str = str(chatid) if chatid_str not in norm_chats: norm_chats.append(chatid_str) self._db.set(self._classname, "norm_watcher", norm_chats) await utils.answer( message, self.apo_lib.utils.get_str("norm_start", self.all_strings, message), ) else: norm_chats.remove(chatid_str) self._db.set(self._classname, "norm_watcher", norm_chats) await utils.answer( message, self.apo_lib.utils.get_str("norm_stopped", self.all_strings, message), ) async def vtautospeedcmd(self, message): """Turns on AutoSpeed for your own Voicemessages in the chat""" speed_chats = self._db.get(self._classname, "speed_watcher", []) chatid = utils.get_chat_id(message) chatid_str = str(chatid) if chatid_str not in speed_chats: speed_chats.append(chatid_str) self._db.set(self._classname, "speed_watcher", speed_chats) await utils.answer( message, self.apo_lib.utils.get_str("speed_start", self.all_strings, message), ) else: speed_chats.remove(chatid_str) self._db.set(self._classname, "speed_watcher", speed_chats) await utils.answer( message, self.apo_lib.utils.get_str("speed_stopped", self.all_strings, message), ) async def vtautopitchcmd(self, message): """Turns on AutoVoiceNormalizer for your own Voicemessages in the chat""" pitch_chats = self._db.get(self._classname, "pitch_watcher", []) chatid = utils.get_chat_id(message) chatid_str = str(chatid) if chatid_str not in pitch_chats: pitch_chats.append(chatid_str) self._db.set(self._classname, "pitch_watcher", pitch_chats) await utils.answer( message, self.apo_lib.utils.get_str("pitch_start", self.all_strings, message), ) else: pitch_chats.remove(chatid_str) self._db.set(self._classname, "pitch_watcher", pitch_chats) await utils.answer( message, self.apo_lib.utils.get_str("pitch_stopped", self.all_strings, message), ) async def vtautogaincmd(self, message): """Turns on AutoVolumeGain for your own Voicemessages in the chat""" gain_chats = self._db.get(self._classname, "gain_watcher", []) chatid = utils.get_chat_id(message) chatid_str = str(chatid) if chatid_str not in gain_chats: gain_chats.append(chatid_str) self._db.set(self._classname, "gain_watcher", gain_chats) await utils.answer( message, self.apo_lib.utils.get_str("gain_start", self.all_strings, message), ) else: gain_chats.remove(chatid_str) self._db.set(self._classname, "gain_watcher", gain_chats) await utils.answer( message, self.apo_lib.utils.get_str("gain_stopped", self.all_strings, message), ) async def vtautocmd(self, message): """Displays all enabled AutoVoice settings in the chat""" current = "" norm_chats = self._db.get(self._classname, "norm_watcher", []) nr_chats = self._db.get(self._classname, "nr_watcher", []) dalek_chats = self._db.get(self._classname, "dalek_watcher", []) pitch_chats = self._db.get(self._classname, "pitch_watcher", []) vcanon_chats = self._db.get(self._classname, "vcanon_watcher", []) speed_chats = self._db.get(self._classname, "speed_watcher", []) gain_chats = self._db.get(self._classname, "gain_watcher", []) chatid = utils.get_chat_id(message) chatid_str = str(chatid) if chatid_str in vcanon_chats: current = ( current + self.apo_lib.utils.get_str("auto_anon_on", self.all_strings, message) + "\n" ) else: current = ( current + self.apo_lib.utils.get_str("auto_anon_off", self.all_strings, message) + "\n" ) if chatid_str in dalek_chats: current = ( current + self.apo_lib.utils.get_str("auto_dalek_on", self.all_strings, message) + "\n" ) else: current = ( current + self.apo_lib.utils.get_str( "auto_dalek_off", self.all_strings, message ) + "\n" ) if chatid_str in pitch_chats: current = ( current + self.apo_lib.utils.get_str("auto_pitch_on", self.all_strings, message) + "\n" ) else: current = ( current + self.apo_lib.utils.get_str( "auto_pitch_off", self.all_strings, message ) + "\n" ) if chatid_str in speed_chats: current = ( current + self.apo_lib.utils.get_str("auto_speed_on", self.all_strings, message) + "\n" ) else: current = ( current + self.apo_lib.utils.get_str( "auto_speed_off", self.all_strings, message ) + "\n" ) if chatid_str in norm_chats: current = ( current + self.apo_lib.utils.get_str("auto_norm_on", self.all_strings, message) + "\n" ) else: current = ( current + self.apo_lib.utils.get_str("auto_norm_off", self.all_strings, message) + "\n" ) if chatid_str in gain_chats: current = ( current + self.apo_lib.utils.get_str("auto_gain_on", self.all_strings, message) + "\n" ) else: current = ( current + self.apo_lib.utils.get_str("auto_gain_off", self.all_strings, message) + "\n" ) if chatid_str in nr_chats: current = ( current + self.apo_lib.utils.get_str("auto_nr_on", self.all_strings, message) + "\n" ) else: current = ( current + self.apo_lib.utils.get_str("auto_nr_off", self.all_strings, message) + "\n" ) return await utils.answer( message, self.apo_lib.utils.get_str( "current_auto", self.all_strings, message ).format(current), ) async def vtautostopcmd(self, message): """Turns off AutoVoice for your own Voicemessages in the chat""" norm_chats = self._db.get(self._classname, "norm_watcher", []) nr_chats = self._db.get(self._classname, "nr_watcher", []) dalek_chats = self._db.get(self._classname, "dalek_watcher", []) pitch_chats = self._db.get(self._classname, "pitch_watcher", []) vcanon_chats = self._db.get(self._classname, "vcanon_watcher", []) speed_chats = self._db.get(self._classname, "speed_watcher", []) gain_chats = self._db.get(self._classname, "gain_watcher", []) chatid = utils.get_chat_id(message) chatid_str = str(chatid) if chatid_str in norm_chats: norm_chats.remove(chatid_str) self._db.set(self._classname, "norm_watcher", norm_chats) if chatid_str in nr_chats: nr_chats.remove(chatid_str) self._db.set(self._classname, "nr_watcher", nr_chats) if chatid_str in dalek_chats: dalek_chats.remove(chatid_str) self._db.set(self._classname, "dalek_watcher", dalek_chats) if chatid_str in pitch_chats: pitch_chats.remove(chatid_str) self._db.set(self._classname, "pitch_watcher", pitch_chats) if chatid_str in vcanon_chats: vcanon_chats.remove(chatid_str) self._db.set(self._classname, "vcanon_watcher", vcanon_chats) if chatid_str in speed_chats: speed_chats.remove(chatid_str) self._db.set(self._classname, "speed_watcher", speed_chats) if chatid_str in gain_chats: gain_chats.remove(chatid_str) self._db.set(self._classname, "gain_watcher", gain_chats) await utils.answer( message, self.apo_lib.utils.get_str("vtauto_stopped", self.all_strings, message), ) @loader.watcher("out", "only_media") async def watcher(self, message: Message): chatid = utils.get_chat_id(message) chatid_str = str(chatid) norm_chats = self._db.get(self._classname, "norm_watcher", []) nr_chats = self._db.get(self._classname, "nr_watcher", []) dalek_chats = self._db.get(self._classname, "dalek_watcher", []) pitch_chats = self._db.get(self._classname, "pitch_watcher", []) vcanon_chats = self._db.get(self._classname, "vcanon_watcher", []) speed_chats = self._db.get(self._classname, "speed_watcher", []) gain_chats = self._db.get(self._classname, "gain_watcher", []) chat = await message.get_chat() chattype = await getchattype(message) if ( chatid_str not in nr_chats and chatid_str not in dalek_chats and chatid_str not in norm_chats and chatid_str not in pitch_chats and chatid_str not in vcanon_chats and chatid_str not in speed_chats and chatid_str not in gain_chats ): return if ( chattype != "channel" and message.sender_id != self.tg_id or chattype == "channel" and not chat.admin_rights.delete_messages ): return if not message.voice or message.via_bot or message.forward: return if message.reply: reply = await message.get_reply_message() nr_lvl = self.config["nr_lvl"] pitch_lvl = self.config["pitch_lvl"] speed_lvl = self.config["speed_lvl"] gain_lvl = self.config["gain_lvl"] if chatid_str in dalek_chats: nr_lvl = 0.8 if chatid_str in vcanon_chats: nr_lvl = 0.8 pitch_lvl = -4.5 msgs = await message.forward_to(self.tg_id) await self._client.delete_messages(chatid, message) file = io.BytesIO() file.name = msgs.file.name await self._client.download_file(msgs, file) filename = msgs.file.name or "voice" ext = msgs.file.ext if ext == ".oga": filename_new = filename.replace(ext, "") filename_new = filename.replace(".ogg", "") else: filename_new = filename.replace(ext, "") file.seek(0) await self._client.delete_messages(self.tg_id, msgs) file.name = filename_new + ext filename, file_ext = os.path.splitext(file.name) file.seek(0) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".mp3", "1", "libmp3lame" ) file.seek(0) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".wav", "1", "pcm_s16le" ) file.seek(0) if ( chatid_str in nr_chats or chatid_str in vcanon_chats or chatid_str in dalek_chats ): file, filename, file_ext = await audiodenoiser( file, filename, file_ext, nr_lvl ) file.seek(0) if ( chatid_str in norm_chats or chatid_str in vcanon_chats or chatid_str in dalek_chats or chatid_str in gain_chats ): file, filename, file_ext = await audionormalizer( file, filename, file_ext, gain_lvl ) file.seek(0) if chatid_str in dalek_chats or chatid_str in vcanon_chats: file, filename, file_ext = await dalekvoice(file, filename, file_ext) file.seek(0) if chatid_str in pitch_chats or chatid_str in vcanon_chats: file, filename, file_ext = await audiopitcher( file, filename, file_ext, pitch_lvl ) file.seek(0) if chatid_str in speed_chats: file, filename, file_ext = await audiospeedup( file, filename, file_ext, speed_lvl ) file.seek(0) file, filename, file_ext = await audiohandler( file, filename, file_ext, ".ogg", "2", "libopus" ) file.seek(0) file.name = filename + file_ext if reply: await self._client.send_file(chatid, file, voice_note=True, reply_to=reply) else: await self._client.send_file(chatid, file, voice_note=True)