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

使用googletrans翻译SRT字幕文件遇TypeError错误求助

问题:使用googletrans翻译SRT字幕时出现TypeError错误

错误信息:

TypeError: the JSON object must be str, bytes or bytearray, not NoneType

代码示例

from googletrans import Translator
import glob
import subprocess
import os
import json


f = open('/Users/agustinleira/Desktop/Series Mac/Outlander/Temporada 3/1.srt', 'r')
if f.mode == 'r':
    print("Hola")
    contents = f.read()
    #print(contents)
    #print((type(contents)))
    file_translate = Translator()
    #print(type(file_translate))
    #print(dir(file_translate))
    #text_file = json.dumps(contents)#"Hola todo bien" #str(contents)
    result = file_translate.translate(contents, dest='en')
    print(result.text)

SRT文件内容示例

1
00:00:02,003 --> 00:00:03,004
Narrator: Previously...

2
00:00:03,129 --> 00:00:05,047
The battle of culloden
will happen... today.

3
00:00:05,131 --> 00:00:06,757
Just as history foretold.

4
00:00:07,175 --> 00:00:08,801
Jamie: And we must go now.
解决方案

错误原因

  • 版本失效:旧版googletrans(4.x正式版及以下)依赖的谷歌翻译API已停用,请求返回None,解析JSON时触发错误。
  • 文本过大:直接传入整个SRT文件内容,可能触发谷歌翻译的请求长度限制,导致返回异常。
  • 格式干扰:SRT包含序号、时间轴等非翻译内容,直接翻译会打乱API处理逻辑,也会让结果混乱。

修复步骤

1. 更换可用的googletrans版本

卸载旧版,安装社区维护的测试版本:

pip uninstall googletrans -y
pip install googletrans==4.0.0-rc1

2. 解析SRT并仅翻译文本内容

先提取SRT中的纯文本,翻译后重新组装成标准SRT格式,避免非文本内容干扰:

from googletrans import Translator
import time

# 解析SRT文件,拆分每个字幕块
def parse_srt(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        lines = f.readlines()
    
    srt_blocks = []
    current_block = {'index': '', 'time': '', 'text': []}
    
    for line in lines:
        line = line.strip()
        if not line:
            if current_block['index']:
                srt_blocks.append(current_block)
                current_block = {'index': '', 'time': '', 'text': []}
            continue
        if not current_block['index']:
            current_block['index'] = line
        elif not current_block['time']:
            current_block['time'] = line
        else:
            current_block['text'].append(line)
    # 处理最后一个未闭合的块
    if current_block['index']:
        srt_blocks.append(current_block)
    return srt_blocks

# 翻译每个字幕块的文本内容
def translate_blocks(blocks, dest_lang='en'):
    translator = Translator()
    translated_blocks = []
    for block in blocks:
        text = '\n'.join(block['text'])
        translated_result = translator.translate(text, dest=dest_lang)
        translated_blocks.append({
            'index': block['index'],
            'time': block['time'],
            'text': translated_result.text.split('\n')
        })
        time.sleep(0.3)  # 添加延时,避免触发请求频率限制
    return translated_blocks

# 将翻译后的块写入新SRT文件
def write_srt(blocks, output_path):
    with open(output_path, 'w', encoding='utf-8') as f:
        for block in blocks:
            f.write(f"{block['index']}\n")
            f.write(f"{block['time']}\n")
            f.write('\n'.join(block['text']) + '\n\n')

# 执行流程
input_path = '/Users/agustinleira/Desktop/Series Mac/Outlander/Temporada 3/1.srt'
output_path = '/Users/agustinleira/Desktop/Series Mac/Outlander/Temporada 3/1_en.srt'

original_blocks = parse_srt(input_path)
translated_blocks = translate_blocks(original_blocks)
write_srt(translated_blocks, output_path)

3. 额外注意事项

  • 如果仍出现请求错误,可以延长time.sleep()的时长,或者添加重试逻辑。
  • 确保SRT文件编码为UTF-8,避免读取时出现乱码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:10:32