diff --git a/backend/__init__.py b/backend/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/transcriber/base.py b/backend/app/transcriber/base.py index ebe2ba5..5cb2758 100644 --- a/backend/app/transcriber/base.py +++ b/backend/app/transcriber/base.py @@ -11,4 +11,13 @@ class Transcriber(ABC): :param file_path:音频路径 :return: 返回一个 TranscriptResult 类 ''' + pass + + def on_finish(self,video_path:str,result: TranscriptResult)->None: + ''' + 当音频转录完成时调用 + :param video_path: 视频路径 + :param result: 识别结果 + :return: + ''' pass \ No newline at end of file diff --git a/backend/app/transcriber/whisper.py b/backend/app/transcriber/whisper.py index 271f041..c06c749 100644 --- a/backend/app/transcriber/whisper.py +++ b/backend/app/transcriber/whisper.py @@ -6,6 +6,8 @@ from app.transcriber.base import Transcriber from app.utils.env_checker import is_cuda_available, is_torch_installed from app.utils.path_helper import get_model_dir +from events import transcription_finished + ''' Size of the model to use (tiny, tiny.en, base, base.en, small, small.en, distil-small.en, medium, medium.en, distil-medium.en, large-v1, large-v2, large-v3, large, distil-large-v2, distil-large-v3, large-v3-turbo, or turbo ''' @@ -64,29 +66,37 @@ class WhisperTranscriber(Transcriber): @timeit def transcript(self, file_path: str) -> TranscriptResult: + try: - segments_raw, info = self.model.transcribe(file_path) + segments_raw, info = self.model.transcribe(file_path) - segments = [] - full_text = "" + segments = [] + full_text = "" - for seg in segments_raw: - text = seg.text.strip() - full_text += text + " " - segments.append(TranscriptSegment( - start=seg.start, - end=seg.end, - text=text - )) + for seg in segments_raw: + text = seg.text.strip() + full_text += text + " " + segments.append(TranscriptSegment( + start=seg.start, + end=seg.end, + text=text + )) - return TranscriptResult( - language=info.language, - full_text=full_text.strip(), - segments=segments, - raw=info - ) + result= TranscriptResult( + language=info.language, + full_text=full_text.strip(), + segments=segments, + raw=info + ) + self.on_finish(file_path, result) + return result + except Exception as e: + print(f"转写失败:{e}") -if __name__ == '__main__': - print(WhisperTranscriber(cpu_threads=8).transcript( - '''D:\\data_backup_from_ssd\\02_个人项目\\11_BiliNote\\backend\\data\\BV1vcZ5YQE9X.mp3''')) + def on_finish(self,video_path:str,result: TranscriptResult)->None: + print("转写完成") + transcription_finished.send({ + "file_path": video_path, + }) + diff --git a/backend/events/__init__.py b/backend/events/__init__.py new file mode 100644 index 0000000..1f5c236 --- /dev/null +++ b/backend/events/__init__.py @@ -0,0 +1,8 @@ +# 注册监听器 +from events.handlers import cleanup_temp_files +from events.signals import transcription_finished + + +def register_handler(): + transcription_finished.connect(cleanup_temp_files) + diff --git a/backend/events/handlers.py b/backend/events/handlers.py new file mode 100644 index 0000000..422f41d --- /dev/null +++ b/backend/events/handlers.py @@ -0,0 +1,8 @@ +import os + + +def cleanup_temp_files(data): + print(f"🧹 清理转写文件:{data['file_path']}") + os.remove(data['file_path']) + + diff --git a/backend/events/signals.py b/backend/events/signals.py new file mode 100644 index 0000000..18e5632 --- /dev/null +++ b/backend/events/signals.py @@ -0,0 +1,2 @@ +from blinker import signal +transcription_finished = signal("transcription_finished") \ No newline at end of file diff --git a/backend/main.py b/backend/main.py index b53d2bd..5243ef5 100644 --- a/backend/main.py +++ b/backend/main.py @@ -7,6 +7,7 @@ from dotenv import load_dotenv from app import create_app from app.db.video_task_dao import init_video_task_table from app.transcriber.transcriber_provider import get_transcriber +from events import register_handler from ffmpeg_helper import ensure_ffmpeg_or_raise load_dotenv() @@ -26,15 +27,13 @@ if not os.path.exists(out_dir): app = create_app() app.mount(static_path, StaticFiles(directory=static_dir), name="static") +async def startup_event(): + register_handler() @app.on_event("startup") -def check_env(): +async def startup_event(): + register_handler() ensure_ffmpeg_or_raise() -@app.on_event("startup") -async def load_model_on_startup(): get_transcriber() - -@app.on_event("startup") -def startup(): init_video_task_table() if __name__ == "__main__":