Ответы пользователя по тегу Python
  • Почему код перестаёт работать?

    @Umys
    Кажется, код содержит ошибку, связанную с неправильной передачей аргументов функции `apply_tts` для модели Silero. Проверьте соответствующие имена аргументов и обновите их. Ваш исправленный код должен выглядеть так:

    import time
    import sounddevice as sd
    import torch
    print(sd.query_devices())
    print(sd.default.device)
    language = 'ru'
    model_id = 'ru_v3'
    sample_rate = 48000
    speaker = 'aidar' # aidar, baya, kseniya, xenia, random
    put_accent = True
    put_yo = True
    device = torch.device('cpu')
    text = "привет мир"
    print("1")
    model, _ = torch.hub.load(repo_or_dir='snakers4/silero-models',
    model='silero_tts',
    language=language,
    speaker=model_id)
    print("2")
    model.to(device)
    print("3")

    print(text)

    audio = model(text=text,
    speaker=speaker,
    sample_rate=sample_rate,
    put_accent=put_accent,
    put_yo=put_yo)

    print("4")
    sd.play(audio, sample_rate)
    sd.wait()
    ```
    Ответ написан
  • Некорректное переключение аудио. Где может крыться проблема?

    @Umys
    Для решения этой проблемы я предлагаю обернуть вызов self.play_next() в after в функцию для предотвращения непосредственного вызова. И работать с asyncio, чтобы вызов коллбэк функции был корректным.

    Попробуйте обновить вашу функцию play_next следующим образом:

    async def play_next(self):
    self.voice_client.pause()
    self.voice_client.stop()

    if self.music_queue.__len__() > 0:
    print("next comp")
    track_name, url = self.music_queue[0]['title'], self.music_queue[0]['url']
    if self.embed.fields.__len__() == 0:
    self.embed.add_field(name="Playing now", value=track_name, inline=True)
    else:
    self.embed.set_field_at(index=0, name="Playing now", value=track_name, inline=True)
    print("before = " + str(len(self.music_queue)))
    self.music_queue.pop(0)
    print("after = " + str(len(self.music_queue)))
    try:
    self.que_fetch()
    FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}
    source = disnake.PCMVolumeTransformer(disnake.FFmpegPCMAudio(source=url, **FFMPEG_OPTIONS,executable=r"dependencies\FFMPEG\bin\ffmpeg.exe"))

    def play_next_callback(e):
    coro = self.play_next()
    future = asyncio.run_coroutine_threadsafe(coro, self.bot.loop)
    future.result()

    self.voice_client.play(source= source, after=play_next_callback)
    self.is_playing = True

    except disnake.ClientException as e:
    print("player playing!: ", e)
    except Exception as e:
    print(e)

    else:
    print("stopping!")
    self.embed.clear_fields()
    coro = self.stopall()
    asyncio.run_coroutine_threadsafe(coro=coro, loop=self.bot.loop).result()

    return

    Также обновите вашу функцию next_track_callback до версии с префиксом "async":

    async def next_track_callback(self, interaction: disnake.Interaction):
    await interaction.response.defer()
    await self.play_next()

    Попробуйте)
    Ответ написан
    2 комментария