亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

打破語言障礙:我如何在一小時內開發出視頻字幕翻譯的Telegram機器人

KtuvitBot标志。Credit: DALL-E 3。

我们需要未经处理的原始信息

在以色列,Telegram 已经成为越来越流行的获取新闻的平台。人们喜欢快速获取未经筛选的信息更新,而且可以关注特定的群组,避免了评论和算法的干扰。最近,该国最受欢迎的 Telegram 群组之一是一个专注于分享直接来自阿拉伯世界的社交媒体内容的频道,这使得以色列人因此能接触到更多不同的观点。

昨天,我在一个频道里发现了一段没有字幕的阿拉伯语视频。我想看看叙利亚新总统的采访内容,但没有找到快速加字幕的办法。在一个小时内,我建立了一个叫做‘Ktuvit’(发音为ktOO-vEEt,听起来像希伯来语中的‘花椰菜’‘כרובית’,实际是字幕‘כתוביות’的谐音)的小工具来解决这个问题的。

对于已经在 Telegram 上观看新闻的人来说,只需两步即可翻译视频——将视频分享给机器人,然后等待返回带有翻译字幕的版本。这种无缝集成使得整个过程在现有的新闻消费流程中非常方便。

它是怎么工作的

克图维特(Ktuvit)的操作非常直接:

  1. 使用 FFmpeg 从视频中提取音频
  2. 使用 OpenAI 的 Whisper API 对音频进行转写
  3. 使用 GPT-4 将转写内容翻译,并保留 SRT 格式
  4. 再用 FFmpeg 把字幕加回到视频里
  5. 最后把加了字幕的视频发回给用户

使用Ktuvit进行字幕生成演示

试试看:https://t.me/ktuvitbot

技术实现方面
设置:Telegram小助手账号

创建一个Telegram机器人要从BotFather开始,BotFather是Telegram官方的机器人,用于创建和管理其他机器人。这个过程会给你一个API令牌,作为你的机器人的认证密钥。


1. 在 Telegram 上给 @BotFather 发个消息  

2. 发送 /newbot 命令来创建你的新机器人  

3. 根据提示来命名你的机器人  

4. BotFather 将会给你一个类似 123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ 的 token

有了 token,我们可以使用 python-telegram-bot 库来启动我们的机器人。

    import os  
    import openai  # 用于OpenAI的Whisper和GPT-4 API  
    import ffmpeg  
    from telegram import Update, InputFile  
    from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext  
    import tempfile  
    import uuid  # 用于生成唯一的文件名。  
    import shutil  # 用于清理临时文件  
    import logging  
    from collections import defaultdict  
    from datetime import datetime, timedelta  

    TELEGRAM_BOT_TOKEN = os.getenv('KTUVIT_TELEGRAM_BOT_TOKEN')  
    openai.api_key = os.getenv('OPENAI_API_KEY')  

    def main():  
        updater = Updater(TELEGRAM_BOT_TOKEN)  
        dp = updater.dispatcher  
        # 注册命令处理程序  
        add_handler(CommandHandler("start", start))  
        add_handler(CommandHandler("setlanguage", set_language))  

        # 注册消息处理程序  
        add_handler(MessageHandler(Filters.video | Filters.document, handle_video))  
        # 启动机器人并进入空闲模式  
        updater.start_polling()  
        updater.idle()

这段代码建立了机器人的命令体系——用户可以启动机器人并设置他们喜欢的语言。最关键的是,它注册了一个处理视频的处理器函数,这才是机器人最关键的功能。

根据专家建议,翻译如下:

用 FFmpeg 做视频处理

FFmpeg 是一个强大的多媒体框架,这个框架我们用它来做音频的提取和字幕的集成。这两步操作完成了原本复杂的视频处理工作。

# 从视频中提取音频  
ffmpeg.input(video_path).output(audio_path).run(quiet=True)  

# 稍后,给视频添加字幕  
ffmpeg.input(video_path).output(output_video_path,   
    vf=f'subtitles={translated_srt_path}').run(quiet=True)

第一次操作提取出一个Whisper能够处理的WAV音频文件,而第二次操作则将翻译的字幕直接嵌入到视频帧中。

OpenAI的Whisper转录

Whisper的API让语音识别变得非常简单:

打开音频文件 `audio_path`,以二进制读取模式,然后使用 `openai.Audio.transcribe` 函数将其转换为文本。在这个过程中,我们使用了模型 `"whisper-1"`,并将输出格式设置为 `"srt"`。

response_format="srt" 参数尤为重要——它提供了一个带有时间戳的正确格式的字幕文件,省去了自己构建字幕文件结构的麻烦。

使用GPT-4进行翻译。

在 Ktuvit 中,一个关键的效率技巧是一次性翻译整个 SRT 文件。而不是逐字幕处理,这样会需要数百次 API 调用,而我们则直接将整个文件发送给 GPT-4:

    def 翻译_srt(srt_content: str, 目标语言: str) -> str:  
        response = openai.ChatCompletion.create(  
            model="gpt-4o",  
            messages=[  
                {"role": "system", "content": "你是一位专业的字幕翻译员。"},  
                {"role": "user", "content": (  
                    f"将以下SRT字幕翻译成{目标语言},并在保持SRT格式不变的前提下,仅返回用<start>和<end>标签包裹的翻译内容,不要添加任何额外的解释或文本。不要修改SRT文件中的时间戳或数字。\n\n"  
                    f"{srt_content}"  
                )}  
            ],  
            max_tokens=3000  
        )  

        翻译文本 = response['choices'][0]['message']['content'].strip()  
        # 如果存在标签,则提取标签内的内容  
        if '<start>' in 翻译文本 and '<end>' in 翻译文本:  
            翻译文本 = 翻译文本.split('<start>')[1].split('<end>')[0].strip()  

        return 翻译文本

这种方法不仅减少了API的成本,还提高了翻译质量,因为GPT-4o能够保持字幕之间的上下文,从而保持视频中对话的流畅。

支持 RTL(从右到左)语言

希伯来语和阿拉伯语这两种从右向左书写的语言,为字幕的呈现带来了特别的挑战。除非我们应用特殊的Unicode格式进行调整,否则字幕的标点符号顺序会出现问题。

    if is_rtl:  
        rtl_start = '\u202B'  # 右向左嵌入  
        rtl_end = '\u202C'    # 取消定向格式  

        fixed_lines = []  
        for line in translated_content.splitlines():  
            if line.strip() and line.strip() 不是数字 and '-->' not in line:  
                line = f"{rtl_start}{line}{rtl_end}"  
            fixed_lines.append(line)  

        translated_content = "\n".join(fixed_lines)

这些 Unicode 控制字符将字幕文本嵌入到从右到左的环境,确保问号、感叹号等标点符号正常显示,同时避免将这些控制符应用于时间戳行。

处理Telegram机器人的消息

机器人核心功能的核心是handle_video处理程序。当用户发送视频时,它会协调整个处理过程。

    def 处理视频消息(update: Update, context: CallbackContext):  
        用户ID = update.message.from_user.id  
        if not 可以上传视频(用户ID):  
            update.message.reply_text("您已达到每日上传5个视频的上限,请明天再试。")  
            return  

        # 获取视频或文档文件  
        视频文件 = update.message.video or update.message.document  

        # 处理视频  
        发送处理状态(update, context, "正在处理您的视频...")  

        # 下载、转录、翻译并添加字幕  
        # ...  

        # 发送处理结果  
        with open(输出视频文件路径, 'rb') as 视频文件:  
            context.bot.send_video(  
                chat_id=update.message.chat_id,   
                video=视频文件,   
                filename=f'{文件基础名称}_sub.mp4'  
            )

我在整个过程中加入了状态更新,让用户在等待时知道发生了什么事。整个过程通常需要1到3分钟,根据视频的长度,因此这些进度消息能帮助用户保持参与感。

技术使我们更加亲近。

最让我惊讶的是,这个工具的快速成型。几年前,要打造类似这样的工具,需要掌握多个复杂领域的专业知识。如今,借助像Whisper和GPT-4等这样的API工具,开发人员可以在几小时内完成,而不是几个月,创建出能够快速打破语言障碍的强大工具。

在全球不稳定时期,帮助我们跨越语言障碍获取和理解信息的技术变得尤为宝贵。对于任何人试图理解复杂的全球事件来说,像 Ktuvit 这样的工具提供了一种虽小却意义非凡的方式来弥合这些鸿沟。

完整的代码可以在Ktuvit GitHub仓库上访问。

Shlomo Tannor 是亚马逊的应用科学家,专注于 GenAI。他拥有计算机科学硕士学位,研究方向为自然语言处理,并拥有数学和计算机科学的学士学位。

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消