Python语音转文字与SRT生成:融合拼音处理的完整方案

Python语音转文字与SRT生成:融合拼音处理的完整方案

一、语音转文字技术概述

语音转文字(Speech-to-Text, STT)是将音频信号转换为文本信息的技术,在字幕生成、会议记录、智能客服等领域广泛应用。Python生态中,SpeechRecognition库作为核心工具,支持多种语音识别引擎(如Google Web Speech API、CMU Sphinx等),可处理WAV、MP3等常见音频格式。

以Google Web Speech API为例,其基本流程为:加载音频文件→选择识别引擎→发送请求→获取文本结果。示例代码如下:

  1. import speech_recognition as sr
  2. def audio_to_text(audio_path):
  3. recognizer = sr.Recognizer()
  4. with sr.AudioFile(audio_path) as source:
  5. audio_data = recognizer.record(source)
  6. try:
  7. text = recognizer.recognize_google(audio_data, language='zh-CN')
  8. return text
  9. except sr.UnknownValueError:
  10. return "无法识别音频"
  11. except sr.RequestError as e:
  12. return f"请求错误: {e}"

此代码可实现中文语音的基本识别,但需注意网络连接(Google API依赖)及音频质量对结果的影响。

二、SRT字幕文件生成原理

SRT(SubRip Subtitle)是标准的字幕文件格式,由序号、时间轴、文本三部分组成,每段字幕格式如下:

  1. 1
  2. 00:00:01,000 --> 00:00:04,000
  3. 这是第一句字幕

生成SRT的关键在于时间轴的精确计算。可通过pydub库分析音频时长,结合语音识别结果的时间戳(若引擎支持)或均匀分段策略生成时间轴。例如:

  1. from pydub import AudioSegment
  2. def get_audio_duration(audio_path):
  3. audio = AudioSegment.from_file(audio_path)
  4. return len(audio) / 1000 # 转换为秒
  5. def generate_srt_timeline(total_duration, num_segments):
  6. segment_duration = total_duration / num_segments
  7. timelines = []
  8. for i in range(num_segments):
  9. start = i * segment_duration
  10. end = (i + 1) * segment_duration
  11. # 格式化时间(HH:MM:SS,mmm)
  12. start_str = f"{int(start//3600):02d}:{int((start%3600)//60):02d}:{int(start%60):02d},{int((start%1)*1000):03d}"
  13. end_str = f"{int(end//3600):02d}:{int((end%3600)//60):02d}:{int(end%60):02d},{int((end%1)*1000):03d}"
  14. timelines.append((start_str, end_str))
  15. return timelines

此代码将音频均匀分段,实际应用中需结合语音活动检测(VAD)优化时间轴精度。

三、拼音标注的集成方案

拼音标注可增强字幕的可读性,尤其适用于语言学习场景。Python中,pypinyin库可实现中文转拼音,支持带声调、无声调、多音字处理等模式。示例:

  1. from pypinyin import pinyin, Style
  2. def text_to_pinyin(text, tone=True):
  3. if tone:
  4. style = Style.TONE # 带声调
  5. else:
  6. style = Style.NORMAL # 无声调
  7. pinyin_list = pinyin(text, style=style)
  8. return ' '.join([item[0] for item in pinyin_list])
  9. # 示例
  10. text = "你好世界"
  11. print(text_to_pinyin(text)) # 输出: nǐ hǎo shì jiè

集成到SRT生成流程中,需对每句字幕文本处理后,生成“中文+拼音”的复合文本。例如:

  1. 1
  2. 00:00:01,000 --> 00:00:04,000
  3. 你好世界
  4. nǐ hǎo shì jiè

四、完整实现示例

结合上述模块,完整实现流程如下:

  1. import speech_recognition as sr
  2. from pydub import AudioSegment
  3. from pypinyin import pinyin, Style
  4. def generate_srt_with_pinyin(audio_path, output_path, num_segments=10):
  5. # 1. 语音转文字
  6. recognizer = sr.Recognizer()
  7. with sr.AudioFile(audio_path) as source:
  8. audio_data = recognizer.record(source)
  9. try:
  10. text = recognizer.recognize_google(audio_data, language='zh-CN')
  11. except Exception as e:
  12. print(f"识别错误: {e}")
  13. return
  14. # 2. 计算时间轴
  15. audio = AudioSegment.from_file(audio_path)
  16. total_duration = len(audio) / 1000
  17. timelines = generate_srt_timeline(total_duration, num_segments)
  18. # 3. 分段处理(简化版:均匀分段)
  19. sentences = [text[i*len(text)//num_segments : (i+1)*len(text)//num_segments]
  20. for i in range(num_segments)]
  21. # 4. 生成SRT内容
  22. srt_lines = []
  23. for i, (start, end) in enumerate(timelines, 1):
  24. sentence = sentences[i-1].strip()
  25. if not sentence:
  26. continue
  27. # 拼音转换
  28. pinyin_text = text_to_pinyin(sentence)
  29. # 组合SRT条目
  30. srt_lines.extend([
  31. f"{i}",
  32. f"{start} --> {end}",
  33. f"{sentence}",
  34. f"{pinyin_text}",
  35. ""
  36. ])
  37. # 5. 写入文件
  38. with open(output_path, 'w', encoding='utf-8') as f:
  39. f.write('\n'.join(srt_lines))
  40. def text_to_pinyin(text, tone=True):
  41. style = Style.TONE if tone else Style.NORMAL
  42. pinyin_list = pinyin(text, style=style)
  43. return ' '.join([item[0] for item in pinyin_list])
  44. # 使用示例
  45. generate_srt_with_pinyin("input.wav", "output.srt", num_segments=5)

此代码实现了从音频到带拼音SRT的完整流程,但需注意:

  1. 均匀分段可能割裂句子,实际需结合NLP分句优化。
  2. 语音识别准确率依赖音频质量,建议预处理降噪。
  3. 多音字处理需结合上下文,pypinyin可通过heteronym=True开启多音字模式后手动选择。

五、优化方向与实用建议

  1. 时间轴优化:使用webrtcvad等库检测语音活动,避免静音段生成无效字幕。
  2. 多语言支持:通过language参数切换识别引擎语言(如en-USja-JP)。
  3. 性能提升:对长音频分段处理,并行调用识别API。
  4. 错误处理:添加重试机制应对API限流,记录失败片段供人工修正。
  5. 格式扩展:支持ASS等高级字幕格式,添加字体、颜色等样式。

六、应用场景与价值

  1. 教育领域:生成带拼音的中文学习字幕,辅助非母语者理解。
  2. 媒体制作:快速为视频添加双语字幕,提升内容可访问性。
  3. 无障碍服务:为听障人群提供文字化内容,促进信息平等。
  4. 数据分析:将语音转化为结构化文本,便于后续NLP处理。

通过Python的灵活生态,开发者可低成本构建定制化语音转文字与字幕生成系统,满足从个人创作到企业级应用的多样化需求。