使用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
相关产品推荐
相关产品推荐

