制造双语字幕的计划网上有很多,各式各样,不胜枚举。制造双语字幕的原理也极端简略,无非便是人声布景音别离、语音转文字、文字翻译,最终便是字幕文件的兼并,但美中不足之处这些环节中需求接口api的参加,比方翻译字幕,那么有没有一种彻底离线的解决计划?让普通人也能一键制造双语字幕,成果一个人的字幕组?
人声布景音别离
如果视频不存在喧闹的布景音,那么大多数情况下是不需求做人声和布景音别离的,但考虑到布景音可能会影响语音转文字的准确率,那么人声和布景音别离仍是十分必要的,关于人声抽离,咱们首先想到的解决计划当然是spleeter,但其实,阿里通义实验室开源的大模型彻底不差劲于spleeter,它便是FRCRN语音降噪-单麦-16k,模型官方地址:
https://modelscope.cn/models/iic/speech_frcrn_ans_cirm_16k/summary
FRCRN语音降噪模型是根据频率循环 CRN (FRCRN) 新结构开发出来的。该结构是在卷积编-解码(Convolutional Encoder-Decoder)架构的基础上,经过进一步增加循环层取得的卷积循环编-解码(Convolutional Recurrent Encoder-Decoder)新型架构,能够显着改进卷积核的视界局限性,提高降噪模型对频率维度的特征表达,尤其是在频率长距离相关性表达上取得提高,能够在消除噪声的一起,对语音进行更针对性的辨识和保护。
需求注意的是该模型再Pytorch1.12上有bug,所以最好指定版本运行:
pip install pytorch==1.11 torchaudio torchvision -c pytorch
运行方法也很简略,经过pipeline调用即可:
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
ans = pipeline(
Tasks.acoustic_noise_suppression,
model='damo/speech_frcrn_ans_cirm_16k')
result = ans(
'test.wav',
output_path='output.wav')
语音转文字 faster-whisper
成功别离出人声,接着要做的便是语音转文字,这儿挑选faster-whisper,faster-whisper 是 OpenAI Whisper 模型的从头完成,运用了 CTranslate2,这是一个用于 Transformer 模型的快速推理引擎。比较于 openai/whisper,faster-whisper 的完成速度提高了 4 倍,一起内存占用更少。此外,faster-whisper 还支持在 CPU 和 GPU 上进行 8 位量化,进一步提高了效率。
pip install faster-whisper
随后编写转写代码:
def convert_seconds_to_hms(seconds):
hours, remainder = divmod(seconds, 3600)
minutes, seconds = divmod(remainder, 60)
milliseconds = math.floor((seconds % 1) * 1000)
output = f"{int(hours):02}:{int(minutes):02}:{int(seconds):02},{milliseconds:03}"
return output
# 制造字幕文件
def make_srt(file_path,model_name="small"):
device = "cuda" if torch.cuda.is_available() else "cpu"
if device == "cuda":
model = WhisperModel(model_name, device="cuda", compute_type="float16",download_root="./model_from_whisper",local_files_only=False)
else:
model = WhisperModel(model_name, device="cpu", compute_type="int8",download_root="./model_from_whisper",local_files_only=False)
# or run on GPU with INT8
# model = WhisperModel(model_size, device="cuda", compute_type="int8_float16")
segments, info = model.transcribe(file_path, beam_size=5)
print("Detected language '%s' with probability %f" % (info.language, info.language_probability))
count = 0
with open('./video.srt', 'w') as f: # Open file for writing
for segment in segments:
count +=1
duration = f"{convert_seconds_to_hms(segment.start)} --> {convert_seconds_to_hms(segment.end)}n"
text = f"{segment.text.lstrip()}nn"
f.write(f"{count}n{duration}{text}") # Write formatted string to the file
print(f"{duration}{text}",end='')
with open("./video.srt", 'r',encoding="utf-8") as file:
srt_data = file.read()
return "转写结束"
这儿经过convert_seconds_to_hms方法来把时间戳格局化为标准字幕时间轴。
大模型翻译字幕
这儿字幕翻译咱们依然运用大模型,依然是阿里通义实验室的CSANMT接连语义增强机器翻译-英中-通用范畴-large,模型官方地址:
https://modelscope.cn/models/iic/nlp_csanmt_translation_en2zh/summary
该模型根据接连语义增强的神经机器翻译模型,由编码器、解码器以及语义编码器三者构成。其间,语义编码器以大规模多语言预训练模型为基底,结合自适应对比学习,构建跨语言接连语义表征空间。此外,设计混合高斯循环采样战略,交融拒绝采样机制和马尔可夫链,提高采样效率的一起兼顾自然语言句子在离散空间中固有的散布特性。最终,结合邻域风险最小化战略优化翻译模型,能够有效提高数据的利用效率,显著改进模型的泛化能力和鲁棒性。
依然是经过pipeline进行调用:
# 翻译字幕
def make_tran():
pipeline_ins = pipeline(task=Tasks.translation, model=model_dir_ins)
with open("./video.srt", 'r',encoding="utf-8") as file:
gweight_data = file.read()
result = gweight_data.split("nn")
if os.path.exists("./two.srt"):
os.remove("./two.srt")
for res in result:
line_srt = res.split("n")
try:
outputs = pipeline_ins(input=line_srt[2])
except Exception as e:
print(str(e))
break
print(outputs['translation'])
with open("./two.srt","a",encoding="utf-8")as f:f.write(f"{line_srt[0]}n{line_srt[1]}n{line_srt[2]}n{outputs['translation']}nn")
return "翻译结束"
兼并字幕
虽然字幕现已彻底能够导入剪辑软件进行运用了,但是依然能够经过技能手段来自动化兼并字幕,这儿运用ffmpeg:
# 兼并字幕
def merge_sub(video_path,srt_path):
if os.path.exists("./test_srt.mp4"):
os.remove("./test_srt.mp4")
ffmpeg.input(video_path).output("./test_srt.mp4", vf="subtitles=" + srt_path).run()
return "./test_srt.mp4"
结语
笔者现已将上面说到的技能集成到了一个完好的项目之中,项目地址:
https://github.com/v3ucn/Modelscope_Faster_Whisper_Multi_Subtitle
操作简略,无须考虑:
生成的双语字幕效果:
这也许是首个让普通人也能无脑操作的彻底离线双语字幕制造计划。最终奉上整合包,以与众乡亲同飨:
https://pan.quark.cn/s/55248dcadfb6