尝试使用 Google Translate API 翻译 Discord Message 的结果只是构成输入的字母列表

Results of attempt to translate a Discord Message with Google Translate API is just a list of the letters making up the input

Edit4:进一步审查,如果我用 JP 发送文本并将其翻译成 EN,它会起作用。我现在相信它会将字符串作为 UTF-8 字节序列返回。我现在正试图弄清楚如何将其转换回实际字符​​。

编辑 3:添加了一个 await asyncio.sleep(3) 行,如果我使用英语到西班牙语,它似乎已经修复了它,因为它正确地将 "Hello" 翻译成 "Hola" 仍在获取不过,对于英语到日语来说,这是一条奇怪的台词。我的猜测是它与非罗马字符有关。

Translation:translated_text: "313323313311317"

编辑2:我认为这可能与日语不使用罗马字母有关。将语言更改为西班牙语(ISO 代码:es)仍然会出错。

Translation:translated_text: "H"  
Translation:translated_text: "mi"  
Translation:translated_text: "l"  
Translation:translated_text: "l"  
Translation:translated_text: "o"  
Translation:translated_text: "20"  
Translation:translated_text: "W"  
Translation:translated_text: "o"  
Translation:translated_text: "r"  
Translation:translated_text: "l"  
Translation:translated_text: "re"  

编辑:这没有用。仍然收到相同的回复。我可能已经想通了这个问题。不过我下班后才能测试它。在 API 示例中,我注意到我没有包含一行。所以我认为这可能是它返回奇怪结果的原因。

for translation in response.translations:

原创:我一直在尝试为我的 discord 机器人设置一个附加功能,以使用 Google 的翻译 API 将以短语 !trans 开头的消息从英语翻译成日语。我没有得到翻译结果,而是得到了组成输入的字符的细分。预先感谢您的帮助!

最初的尝试是翻译不和谐消息。此代码还切掉了字符串开头的 !trans 标签。

entrans = message.content[6:]

起初我认为问题出在 Discord 消息的格式化方式上。因此,我试图通过删除该部分并简单地将相位更改为 "Hello".

来隔离该问题
entrans = 'Hello'

当这也不起作用时,我认为这可能是翻译模型的问题。所以我想也许设置模型会有所帮助,但它仍然按字母分解我的翻译结果,唯一的区别是它在每个字母后列出了一行用于所使用的模型。在此示例中,L 所在的位置仅列出了数字。

translations {
  translated_text: "H"
  model: "projects/Unique Project ID/locations/global/models/general/base"
}
translations {
  translated_text: "E"
  model: "projects/Unique Project ID/locations/global/models/general/base"
}
translations {
  translated_text: "332333330333"
  model: "projects/Unique Project ID/locations/global/models/general/base"
}
translations {
  translated_text: "332333330333"
  model: "projects/Unique Project ID/locations/global/models/general/base"
}
translations {
  translated_text: "O"
  model: "projects/Unique Project ID/locations/global/models/general/base"
}

下面列出了我最初尝试的代码。

import discord
import os
from google.cloud import translate_v3beta1 as translate

gclient = translate.TranslationServiceClient()
client = discord.Client()
location = 'global'
parent = gclient.location_path("My Project ID here",location)

@client.event
async def on_message(message):
    if message.content.startswith('!trans'):
        entrans = message.content[6:]
        jtranresult = gclient.translate_text(
            parent=parent,
            contents=entrans,
            mime_type='text/plain',
            source_language_code='en',
            target_language_code='ja',
        )
        print(f"Translation:{jtranresult}")

我预计结果会是日语的“こんニちは”或类似的东西。

相反,我收到了以下结果。

结果:

translations {
  translated_text: "20"
}
translations {
  translated_text: "H"
}
translations {
  translated_text: "e"
}
translations {
  translated_text: "l"
}
translations {
  translated_text: "l"
}
translations {
  translated_text: "o"

首先,translate_text method takes contents arg as list。如果您将字符串作为 contents 提供,那么它将被分隔到列表中。

第二:translate_text方法returnsTranslateTextResponse。我想,要从中获取翻译,您需要从 TranslateTextResponse.translations

获取

所以,我猜你的代码一定是这样的:

import discord
import os
from google.cloud import translate_v3beta1 as translate

gclient = translate.TranslationServiceClient()
client = discord.Client()
location = 'global'
parent = gclient.location_path("My Project ID here",location)

@client.event
async def on_message(message):
    if message.content.startswith('!trans'):
        entrans = message.content[6:]
        jtranresult = gclient.translate_text(
            parent=parent,
            contents=[entrans],
            mime_type='text/plain',
            source_language_code='en',
            target_language_code='ja'
        )
        print(f"Translation: {jtranresult.translations[0].translated_text}")

此外,我建议使用 commands extension 用于带有命令的机器人。类似的东西

import os  # unused import?
from functools import partial
from discord.ext import commands
from google.cloud import translate_v3beta1 as translate

PROJECT_ID = ""

gclient = translate.TranslationServiceClient()
bot = commands.Bot(command_prefix="!")
location = "global"
parent = gclient.location_path(PROJECT_ID, location)


@bot.command()
async def trans(
    ctx, *, text: str
):  # https://discordpy.readthedocs.io/en/v1.2.3/ext/commands/commands.html#keyword-only-arguments
    """Translation command"""  # Will be used as description in !help
    jtranresult = bot.loop.run_in_executor(
        None,
        partial(
            gclient.translate_text,
            parent=parent,
            contents=[text],
            mime_type="text/plain",
            source_language_code="en",
            target_language_code="ja",
        ),
    )
    # run_in_executor will prevent bot "freezing" when translate_text func is active, since it not async
    await ctx.send(f"Translation: {jtranresult.translations[0].translated_text}")