You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用discord.py开发多语言TTS机器人的问题求助

Discord多语言TTS机器人问题解决方案

一、无法获取消息内容的问题修复

1. 修正Intents配置

默认的discord.Intents.default()不包含消息内容权限,需手动开启该权限,同时要在Discord开发者后台开启对应特权网关意图:

import discord
import asyncio

# 配置完整意图,开启消息内容权限
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)

TOKEN = '你的机器人令牌'

2. 修复代码逻辑错误

  • client.run()是阻塞函数,其后的asyncio.run(fetch_messages())永远不会执行,无需单独编写历史消息拉取逻辑,on_message事件会自动监听新消息
  • on_message中channel_id = ID为未定义变量,需替换为实际频道ID数值
  • 必须排除机器人自身发送的消息,避免触发循环:
@client.event
async def on_ready():
    print(f'已登录为 {client.user}')

@client.event
async def on_message(message):
    # 排除机器人自身消息
    if message.author == client.user:
        return
    
    # 替换为目标频道ID
    target_channel_id = 1084766415279620159
    if message.channel.id == target_channel_id:
        print(f'{message.author}: {message.content}')
        # 后续添加TTS播报逻辑

3. 开发者后台配置

进入Discord开发者后台,找到你的机器人,在「Privileged Gateway Intents」栏目下开启Message Content Intent,保存后重启机器人。

二、实现实时TTS播报功能

以支持多语言的gTTS库为例,步骤如下:

1. 安装依赖

pip install gTTS discord.py

2. 添加TTS播报逻辑

在on_message事件中补充语音连接与音频播放代码:

from gtts import gTTS
import os

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    
    target_channel_id = 1084766415279620159
    if message.channel.id == target_channel_id:
        print(f'{message.author}: {message.content}')
        
        # 检查用户是否在语音频道内
        if message.author.voice:
            voice_channel = message.author.voice.channel
            # 连接到目标语音频道
            voice_client = await voice_channel.connect()
            
            # 生成TTS音频(可通过lang参数切换语言,如lang='en'对应英语)
            tts = gTTS(text=message.content, lang='zh-cn')
            tts.save('temp.mp3')
            
            # 播放生成的音频
            voice_client.play(discord.FFmpegPCMAudio('temp.mp3'))
            
            # 等待播放完成后断开连接并删除临时文件
            while voice_client.is_playing():
                await asyncio.sleep(1)
            await voice_client.disconnect()
            os.remove('temp.mp3')
        else:
            await message.channel.send('你需要先加入一个语音频道才能使用TTS播报!')

3. 注意事项

  • 需安装ffmpeg并将其路径加入系统环境变量,若未配置可在FFmpegPCMAudio中指定具体路径
  • 可扩展语言切换逻辑,比如通过命令前缀(如!tts lang en)切换播报语言
  • 处理长消息时可添加分段逻辑,避免生成过大的音频文件

内容的提问来源于stack exchange,提问作者tsheep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:45:27