KtuvitBot标志。Credit: DALL-E 3。
我们需要未经处理的原始信息在以色列,Telegram 已经成为越来越流行的获取新闻的平台。人们喜欢快速获取未经筛选的信息更新,而且可以关注特定的群组,避免了评论和算法的干扰。最近,该国最受欢迎的 Telegram 群组之一是一个专注于分享直接来自阿拉伯世界的社交媒体内容的频道,这使得以色列人因此能接触到更多不同的观点。
昨天,我在一个频道里发现了一段没有字幕的阿拉伯语视频。我想看看叙利亚新总统的采访内容,但没有找到快速加字幕的办法。在一个小时内,我建立了一个叫做‘Ktuvit’(发音为ktOO-vEEt,听起来像希伯来语中的‘花椰菜’‘כרובית’,实际是字幕‘כתוביות’的谐音)的小工具来解决这个问题的。
对于已经在 Telegram 上观看新闻的人来说,只需两步即可翻译视频——将视频分享给机器人,然后等待返回带有翻译字幕的版本。这种无缝集成使得整个过程在现有的新闻消费流程中非常方便。
它是怎么工作的克图维特(Ktuvit)的操作非常直接:
- 使用 FFmpeg 从视频中提取音频
- 使用 OpenAI 的 Whisper API 对音频进行转写
- 使用 GPT-4 将转写内容翻译,并保留 SRT 格式
- 再用 FFmpeg 把字幕加回到视频里
- 最后把加了字幕的视频发回给用户
使用Ktuvit进行字幕生成演示
技术实现方面 设置: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"
参数尤为重要——它提供了一个带有时间戳的正确格式的字幕文件,省去了自己构建字幕文件结构的麻烦。
在 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。他拥有计算机科学硕士学位,研究方向为自然语言处理,并拥有数学和计算机科学的学士学位。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章