Whisper+T5-translate实现python实时语音翻译

打印 上一主题 下一主题

主题 889|帖子 889|积分 2667

1.首先下载模型,加载模型

  1. import torch
  2. import numpy as np
  3. import webrtcvad
  4. import pyaudio
  5. import queue
  6. import threading
  7. from datetime import datetime
  8. from faster_whisper import WhisperModel
  9. from transformers import AutoTokenizer, AutoModelForSeq2SeqLM,pipeline
  10. from transformers import T5ForConditionalGeneration, T5Tokenizer
  11. device = "cuda:0" if torch.cuda.is_available() else "cpu"
  12. torch_dtype = torch.float16
  13. save_directory = "./faster-distil-whiper-large-v3-local"  # 替换为你希望保存的本地路径
  14. # en_zh_directory = "./opus-mt-en-zh-local"  # 替换为你希望保存的本地路径
  15. en_zh_directory = "./t5-translate-en-ru-zh-base-200-sent-local"  # 替换为你希望保存的本地路径
  16. whisperModel = WhisperModel(save_directory, device="cuda", compute_type="float32")
  17. model = T5ForConditionalGeneration.from_pretrained(en_zh_directory)
  18. model.eval()
  19. model.to(device)
  20. tokenizer = T5Tokenizer.from_pretrained(en_zh_directory)
  21. vad = webrtcvad.Vad(3)  # 设置 VAD 灵敏度(0-3,3 最敏感)
  22. prefix = 'translate to zh: '
复制代码
2.配置麦克风

  1. # 初始化 PyAudio
  2. p = pyaudio.PyAudio()
  3. # 设置音频流参数
  4. FORMAT = pyaudio.paInt16  # 16-bit 音频格式
  5. CHANNELS = 1              # 单声道
  6. RATE = 16000              # 采样率(Whisper 需要 16kHz)
  7. FRAME_DURATION = 20       # 每帧的时长(ms)
  8. CHUNK = int(RATE * FRAME_DURATION / 1000)  # 每帧的帧数
  9. MIN_SILENCE_DURATION = 0.2  # 最小静音时长(秒)
复制代码
3.队列构建,构建录音基本参数

  1. # 共享队列,用于录音和推理线程之间的数据交换
  2. audio_queue = queue.Queue()
  3. silence_frames = 0
  4. silence_frames_lock = threading.Lock()
复制代码
4.构建录音函数

  1. # 录音线程
  2. def record_audio():
  3.     global silence_frames
  4.     stream = p.open(
  5.         format=FORMAT,
  6.         channels=CHANNELS,
  7.         rate=RATE,
  8.         input=True,
  9.         frames_per_buffer=CHUNK,
  10.     )
  11.     print("开始录音...按 Ctrl+C 停止")
  12.     try:
  13.         while True:
  14.             # 从麦克风读取音频数据
  15.             data = stream.read(CHUNK)
  16.             audio_data = np.frombuffer(data, dtype=np.int16).astype(np.float32) / 32768.0
  17.             # 使用 VAD 检测语音活动
  18.             if vad.is_speech(data, RATE):
  19.                 audio_queue.put(audio_data)
  20.                 with silence_frames_lock:
  21.                     silence_frames = 0  # 重置静音计数器
  22.             else:
  23.                 with silence_frames_lock:
  24.                     silence_frames += 1  # 重置静音计数器
  25.     except KeyboardInterrupt:
  26.         print("录音停止")
  27.     finally:
  28.         stream.stop_stream()
  29.         stream.close()
  30.         p.terminate()
复制代码
5.构建翻译函数

  1. def process_audio():
  2.     global silence_frames
  3.     audio_buffer = np.array([], dtype=np.float32)
  4.     silence_frames = 0
  5.     while True:
  6.         try:
  7.             # 从队列中获取音频数据
  8.             audio_data = audio_queue.get(timeout=1)  # 超时 1 秒
  9.             audio_buffer = np.concatenate((audio_buffer, audio_data))
  10.         except Exception as e:
  11.             pass
  12.         current_silence_frames = 0
  13.         # 检查静音计数器
  14.         with silence_frames_lock:
  15.             current_silence_frames = silence_frames
  16.         # 如果检测到静音时间超过阈值,处理累积的音频
  17.         if (current_silence_frames > MIN_SILENCE_DURATION * (RATE / CHUNK)) or len(audio_buffer) > 320 * 200:
  18.             if(len(audio_buffer) > 0):#, language="en"
  19.                 segments, _ = whisperModel.transcribe(audio_buffer,vad_filter=True,vad_parameters=dict(min_silence_duration_ms=200), language="en", condition_on_previous_text=True)
  20.                 for segment in segments:
  21.                     if(segment.text == ""):
  22.                         continue
  23.                     elif(segment.text == "Thank you."):
  24.                         print("[%s] %s (%s)" % (str(datetime.now()), "感谢", segment.text))
  25.                     else:            
  26.                         src_text = prefix + segment.text
  27.                         
  28.                         input_ids = tokenizer(src_text, return_tensors="pt")
  29.                         generated_tokens = model.generate(**input_ids.to(device))
  30.                         result = tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
  31.                         print("[%s] %s (%s)" % (str(datetime.now()), result[0], segment.text))
  32.                     
  33.                     
  34.                     # result = pipeline(segment.text)
  35.                     # print("[%s] %s (%s)" % (str(datetime.now()), result[0]['translation_text'], segment.text))
  36.             
  37.                 audio_buffer = np.array([], dtype=np.float16)
  38.                 silence_frames = 0
复制代码
6.启动线程,启动步伐

  1. # 启动录音线程和推理线程
  2. record_thread = threading.Thread(target=record_audio)
  3. process_thread = threading.Thread(target=process_audio)
  4. record_thread.start()
  5. process_thread.start()
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表