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

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

import torch
import numpy as np
import webrtcvad
import pyaudio
import queue
import threading
from datetime import datetime
from faster_whisper import WhisperModel
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM,pipeline
from transformers import T5ForConditionalGeneration, T5Tokenizer
device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16
save_directory = "./faster-distil-whiper-large-v3-local"  # 替换为你希望保存的本地路径
# en_zh_directory = "./opus-mt-en-zh-local"  # 替换为你希望保存的本地路径
en_zh_directory = "./t5-translate-en-ru-zh-base-200-sent-local"  # 替换为你希望保存的本地路径
whisperModel = WhisperModel(save_directory, device="cuda", compute_type="float32")


model = T5ForConditionalGeneration.from_pretrained(en_zh_directory)
model.eval()
model.to(device)
tokenizer = T5Tokenizer.from_pretrained(en_zh_directory)
vad = webrtcvad.Vad(3)  # 设置 VAD 灵敏度(0-3,3 最敏感)
prefix = 'translate to zh: '

2.配置麦克风

# 初始化 PyAudio
p = pyaudio.PyAudio()
# 设置音频流参数
FORMAT = pyaudio.paInt16  # 16-bit 音频格式
CHANNELS = 1              # 单声道
RATE = 16000              # 采样率(Whisper 需要 16kHz)
FRAME_DURATION = 20       # 每帧的时长(ms)
CHUNK = int(RATE * FRAME_DURATION / 1000)  # 每帧的帧数
MIN_SILENCE_DURATION = 0.2  # 最小静音时长(秒)

3.队列构建,构建录音基本参数

# 共享队列,用于录音和推理线程之间的数据交换
audio_queue = queue.Queue()

silence_frames = 0
silence_frames_lock = threading.Lock()

4.构建录音函数

# 录音线程
def record_audio():
    global silence_frames
    stream = p.open(
        format=FORMAT,
        channels=CHANNELS,
        rate=RATE,
        input=True,
        frames_per_buffer=CHUNK,
    )
    print("开始录音...按 Ctrl+C 停止")
    try:
        while True:
            # 从麦克风读取音频数据
            data = stream.read(CHUNK)
            audio_data = np.frombuffer(data, dtype=np.int16).astype(np.float32) / 32768.0

            # 使用 VAD 检测语音活动
            if vad.is_speech(data, RATE):
                audio_queue.put(audio_data)
                with silence_frames_lock:
                    silence_frames = 0  # 重置静音计数器
            else:
                with silence_frames_lock:
                    silence_frames += 1  # 重置静音计数器
    except KeyboardInterrupt:
        print("录音停止")
    finally:
        stream.stop_stream()
        stream.close()
        p.terminate()

5.构建翻译函数

def process_audio():
    global silence_frames
    audio_buffer = np.array([], dtype=np.float32)
    silence_frames = 0

    while True:
        try:
            # 从队列中获取音频数据
            audio_data = audio_queue.get(timeout=1)  # 超时 1 秒
            audio_buffer = np.concatenate((audio_buffer, audio_data))

        except Exception as e:
            pass
        current_silence_frames = 0
        # 检查静音计数器
        with silence_frames_lock:
            current_silence_frames = silence_frames

        # 如果检测到静音时间超过阈值,处理累积的音频
        if (current_silence_frames > MIN_SILENCE_DURATION * (RATE / CHUNK)) or len(audio_buffer) > 320 * 200:
            if(len(audio_buffer) > 0):#, language="en"
                segments, _ = whisperModel.transcribe(audio_buffer,vad_filter=True,vad_parameters=dict(min_silence_duration_ms=200), language="en", condition_on_previous_text=True)
                for segment in segments:
                    if(segment.text == ""):
                        continue
                    elif(segment.text == "Thank you."):
                        print("[%s] %s (%s)" % (str(datetime.now()), "感谢", segment.text))
                    else:            
                        src_text = prefix + segment.text
                        
                        input_ids = tokenizer(src_text, return_tensors="pt")
                        generated_tokens = model.generate(**input_ids.to(device))
                        result = tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
                        print("[%s] %s (%s)" % (str(datetime.now()), result[0], segment.text))
                    
                    
                    # result = pipeline(segment.text)
                    # print("[%s] %s (%s)" % (str(datetime.now()), result[0]['translation_text'], segment.text))
            
                audio_buffer = np.array([], dtype=np.float16)
                silence_frames = 0

6.启动线程,启动程序

# 启动录音线程和推理线程
record_thread = threading.Thread(target=record_audio)
process_thread = threading.Thread(target=process_audio)

record_thread.start()
process_thread.start()

### 实现 Python 基于实时翻译电脑屏幕的功能 要实现基于 Python 的屏幕文本实时翻译功能,可以结合 OCR 技术提取屏幕上的文字并将其传递给翻译 API 进行处理。以下是具体的技术方案: #### 使用 Tesseract 和 Pytesseract 提取屏幕文本 Tesseract 是一种强大的开源 OCR 工具,可以通过 `pytesseract` 库调用它来识别图像中的文本[^1]。 ```python import pytesseract from PIL import ImageGrab import numpy as np import cv2 def capture_screen(): # 截取整个屏幕 screenshot = ImageGrab.grab() # 转换为 OpenCV 格式的图像以便进一步处理 frame = np.array(screenshot) frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) return frame ``` 通过上述函数捕获屏幕截图,并将其转换为适合 Tesseract 处理的格式。 #### 文本检测与提取 利用截屏数据作为输入,执行 OCR 来获取屏幕上显示的文字内容。 ```python def extract_text_from_image(image): # 将图像转回 PIL.Image 对象供 pytessearact 使用 pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_RGB2BGR)) text = pytesseract.image_to_string(pil_image, lang='eng') return text.strip() # 移除多余的空白字符 ``` 此部分代码负责从图片中抽取可读字符串。 #### 集成在线翻译服务 对于翻译环节,可以选择 Google Translate 或其他支持多种语言的服务接口。这里以 googletrans 库为例展示基本流程。 安装依赖项: ```bash pip install googletrans==4.0.0-rc1 ``` 编写翻译逻辑: ```python from googletrans import Translator translator = Translator() def translate_text(text, dest_language="zh-cn"): result = translator.translate(text, dest=dest_language).text return result ``` 以上片段展示了如何将英文源材料转化为目标中文表述形式[^2]。 #### 综合应用实例 最后一步就是把这些组件串联起来形成完整的解决方案。 ```python if __name__ == "__main__": while True: try: screen_frame = capture_screen() detected_text = extract_text_from_image(screen_frame) if detected_text != "": translated_result = translate_text(detected_text, "es") # 修改为目标语种代号 print(f"Detected Text: {detected_text}\nTranslated Result: {translated_result}") except KeyboardInterrupt: break ``` 该脚本会持续运行直到手动停止程序为止,在每次循环迭代过程中完成一次抓图、解析以及翻译操作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值