Foundation pentru Discord voice-to-voice pipeline. - requirements.txt: faster-whisper, silero-vad, num2words, numpy, PyNaCl - vendor/discord-ext-voice-recv/: vendored la commit ac04ea7b09 (bump version 0.5.3a) — Discord voice protocol fragil, upstream hobby fork. Adapter layer in src/voice/_discord_voice_adapter.py izolează churn (swap la py-cord = doar acel fișier rescris). VENDOR_INFO.md documentează update procedure. - tools/voice_setup.py: idempotent setup script — libopus check, ffmpeg check, Supertonic reachable, faster-whisper/silero-vad warm, assets generation. Exit 0 = green, 1 = needs human (currently libopus missing needs `sudo apt install -y libopus0`). - assets/voice/: thinking.wav (filler "Stai puțin să-mi adun gândurile", ~2.8s), mhm.wav (listener noise), beep_200ms.wav (wake-up tone 880Hz). - src/voice/__init__.py: package stub. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
48 lines
1.3 KiB
Python
48 lines
1.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import discord
|
|
from discord.ext import commands, voice_recv
|
|
|
|
discord.opus._load_default()
|
|
|
|
bot = commands.Bot(command_prefix=commands.when_mentioned, intents=discord.Intents.all())
|
|
|
|
class Testing(commands.Cog):
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
|
|
@commands.command()
|
|
async def test(self, ctx):
|
|
def callback(user, data: voice_recv.VoiceData):
|
|
print(f"Got packet from {user}")
|
|
|
|
## voice power level, how loud the user is speaking
|
|
# ext_data = packet.extension_data.get(voice_recv.ExtensionID.audio_power)
|
|
# value = int.from_bytes(ext_data, 'big')
|
|
# power = 127-(value & 127)
|
|
# print('#' * int(power * (79/128)))
|
|
## instead of 79 you can use shutil.get_terminal_size().columns-1
|
|
|
|
vc = await ctx.author.voice.channel.connect(cls=voice_recv.VoiceRecvClient)
|
|
vc.listen(voice_recv.BasicSink(callback))
|
|
|
|
@commands.command()
|
|
async def stop(self, ctx):
|
|
await ctx.voice_client.disconnect()
|
|
|
|
@commands.command()
|
|
async def die(self, ctx):
|
|
ctx.voice_client.stop()
|
|
await ctx.bot.close()
|
|
|
|
@bot.event
|
|
async def on_ready():
|
|
print('Logged in as {0.id}/{0}'.format(bot.user))
|
|
print('------')
|
|
|
|
@bot.event
|
|
async def setup_hook():
|
|
await bot.add_cog(Testing(bot))
|
|
|
|
bot.run("token")
|