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_framesstream = 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_framesaudio_buffer = np.array([], dtype=np.float32)silence_frames = 0while True:try:# 從隊列中獲取音頻數據audio_data = audio_queue.get(timeout=1)  # 超時 1 秒audio_buffer = np.concatenate((audio_buffer, audio_data))except Exception as e:passcurrent_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 == ""):continueelif(segment.text == "Thank you."):print("[%s] %s (%s)" % (str(datetime.now()), "感謝", segment.text))else:            src_text = prefix + segment.textinput_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()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895518.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895518.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895518.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

湖倉分析|浙江霖梓基于 Doris + Paimon 打造實時/離線一體化湖倉架構

導讀:浙江霖梓早期使用 CDH 產品套件搭建了大數據系統,面臨業務邏輯冗余、查詢效率低下等問題,基于 Apache Doris 進行整體架構與表結構的重構,并基于湖倉一體和查詢加速展開深度探索與實踐,打造了 Doris Paimon 的實…

git bash在github的庫中上傳或更新本地文件

一、將本地文件上傳到 GitHub 倉庫 1. 創建 GitHub 倉庫 如果你還沒有在 GitHub 上創建倉庫,首先需要創建一個新的倉庫: 登錄到 GitHub。點擊右上角的 按鈕,選擇 New repository。給你的倉庫起個名字,并選擇 Public 或 Privat…

Jmeter壓測怎么控制TPS

壓測固定TPS的接口 有些任務需要我們控制接口的TPS,例如每秒請求一次。 TPS定時器 然后1個并發持續運行 壓測結果 需要注意TPS在1.0/s左右,有時可能是1.2、1.3,定時器會自動調整壓力,讓TPS保持在1.0左右。

ArcGISPro 新建shp+數據結構

import arcpy# 設置工作空間和 Shapefile 存放路徑 shp_path r"C:\path\to\your\folder\PolygonZY.shp" # Shapefile 存放路徑 fields [("CHBH", "TEXT", 20),("ZCMC", "TEXT", 100),("ZCLX", "TEXT"…

理解WebGPU 中的 GPUAdapter :連接瀏覽器與 GPU 的橋梁

在 WebGPU 開發中, GPUAdapter 是一個至關重要的對象,它作為瀏覽器與 GPU 之間的橋梁,為開發者提供了請求 GPU 設備、查詢 GPU 特性以及獲取適配器信息的能力。本文將詳細介紹 GPUAdapter 的核心屬性和方法,并通過實際代碼…

信呼OA辦公系統sql注入漏洞分析

漏洞描述 信呼OA辦公系統uploadAction存在SQL注入漏洞,攻擊者可利用該漏洞獲取數據庫敏感信息。 環境搭建 源碼下載地址:https://github.com/rainrocka/xinhu 下載后解壓到本地網站根目錄下,配置好數據庫,然后安裝即可 默認密…

vue框架生命周期詳細解析

Vue.js 的生命周期鉤子函數是理解 Vue 組件行為的關鍵。每個 Vue 實例在創建、更新和銷毀過程中都會經歷一系列的生命周期階段,每個階段都有對應的鉤子函數,開發者可以在這些鉤子函數中執行特定的操作。 Vue 生命周期概述 Vue 的生命周期可以分為以下幾…

一文深入了解DeepSeek-R1:模型架構

本文深入探討了 DeepSeek-R1 模型架構。讓我們從輸入到輸出追蹤 DeepSeek-R1 模型,以找到架構中的新發展和關鍵部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架構。本文旨在涵蓋其設計的所有重要方面。 📝 1. 輸入上下文長度 DeepSeek-R1的輸入上下文長…

開發基礎(8):鴻蒙圖表開發

mpchart mpchart是一個包含各種類型圖表的圖表庫,主要用于業務數據匯總,例如銷售數據走勢圖,股價走勢圖等場景中使用,方便開發者快速實現圖表UI,mpchart主要包括線形圖、柱狀圖、餅狀圖、蠟燭圖、氣泡圖、雷達圖、瀑布圖等自定義圖表庫。 柱狀圖 導入import {BarChart, …

條款03:盡可能使用 const

const 允許我們指定一個語義約束,使某個值應該保持不變 1、const 修飾 變量,指針,函數,函數返回值等,可以使程序減少錯誤,或者更容易檢測錯誤: 指針常量:int* const p;//指針地址不…

算法兵法全略(譯文)

目錄 始計篇 謀攻篇 軍形篇 兵勢篇 虛實篇 軍爭篇 九變篇 行軍篇 地形篇 九地篇 火攻篇 用間篇 始計篇 算法,在當今時代,猶如國家關鍵的戰略武器,也是處理各類事務的核心樞紐。算法的世界神秘且變化萬千,不夠賢能聰慧…

開關電源實戰(一)寬范圍DC降壓模塊MP4560

系列文章目錄 文章目錄 系列文章目錄MP4560MP4560 3.8V 至 55V 的寬輸入范圍可滿足各種降壓應用 MOSFET只有250mΩ 輸出可調0.8V-52V SW:需要低VF肖特基二極管接地,而且要靠近引腳,高壓側開關的輸出。 EN:輸入使能,拉低到閾值以下關閉芯片,拉高或浮空啟動 COMP:Compens…

微軟AutoGen高級功能——Magentic-One

介紹 大家好,博主又來給大家分享知識了,這次給大家分享的內容是微軟AutoGen框架的高級功能Magentic-One。那么它是用來做什么的或它又是什么功能呢,我們直接進入正題。 Magentic-One Magnetic-One是一個通用型多智能體系統,用于…

DeepSeek是如何通過“蒸餾”技術打造自己的AI模型

1 引言: 最近,外媒對中國公司——DeepSeek進行了猛烈抨擊,指控其采用了所謂的“蒸餾”(Distillation)技術,涉嫌抄襲甚至作弊。那么,什么是“蒸餾”技術? 在人工智能領域,…

【廣州大學主辦,發表有保障 | IEEE出版,穩定EI檢索,往屆見刊后快至1個月檢索】第二屆電氣技術與自動化工程國際學術會議 (ETAE 2025)

第二屆電氣技術與自動化工程國際學術會議 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大會官網:http://www.icetae.com/【更多詳情】 會議時間:2025年4月25-27日 會議地點&#xff1a…

伯克利 CS61A 課堂筆記 08 —— Strings and Dictionaries

本系列為加州伯克利大學著名 Python 基礎課程 CS61A 的課堂筆記整理,全英文內容,文末附詞匯解釋。 目錄 01 Strings 字符串 Ⅰ Strings are An Abstraction. Ⅱ Strings Literals have Three Forms Ⅲ String are Sequences 02 Dictionaries 字典 …

基于 GEE 計算研究區年均地表溫度數據

目錄 1 代碼解析 2 完整代碼 3 運行結果 1 代碼解析 (1)定義研究區: // 研究區的范圍需要自己提前上傳 var dataset table;// 將研究區顯示在中心,后面的數字為縮放等級,范圍從1 - 24 Map.centerObject(dataset,…

docker compose快速部署kafka-connect集群

先部署kafka集群,啟動 參考:docker compose部署kafka集群-CSDN博客 創建timezone文件,內容填寫Asia/Shanghai 再部署kafka-connect集群 networks: net: external: true services: kafka-connect1: restart: always image:…

Hutool - BloomFilter:便捷的布隆過濾器實現

1. 布隆過濾器簡介 布隆過濾器(Bloom Filter)是一種空間效率極高的概率型數據結構,用于判斷一個元素是否存在于一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的算法,但缺點是有一定的誤判率,即判斷元素存在…

日常知識點之遺留問題梳理(定時器/時間輪定時器)

1:簡單基礎 定時器的核心知識點,對我來說就是獲取當前時間和設置回調函數。 簡單練習: ? c語言通過gettimeofday 獲取當前時間并進行處理 ? 回調函數的定義(函數參數有必要適當存儲) typedef void(Timerfunc)(vo…