From 57f47a9aa4f6b066063761fd69384d5bebdd9869 Mon Sep 17 00:00:00 2001 From: Egor Deev <67710823+IGlek@users.noreply.github.com> Date: Tue, 6 May 2025 17:29:20 +0300 Subject: [PATCH] v. 0.1 --- api_app/__init__.py | 2 + api_app/grpc_client/__init__.py | 2 + api_app/grpc_client/client.py | 90 ++++++++++++++++++++++++++ api_app/migrations/0001_initial.py | 33 ++++++++++ api_app/migrations/__init__.py | 0 api_app/models.py | 25 +++++++ api_app/services/__init__.py | 2 + api_app/services/scan.py | 66 +++++++++++++++++++ api_app/services/vosk_recognizer.py | 51 +++++++++++++++ api_app/urls.py | 8 +++ api_app/views.py | 77 ++++++++++++++++++++++ api_project/__init__.py | 2 + api_project/settings.py | 69 ++++++++++++++++++++ api_project/urls.py | 13 ++++ api_project/wsgi.py | 14 ++++ manage.py | 20 ++++++ media/uploads/audio.ogg | Bin 0 -> 98293 bytes proto/text_service.proto | 18 ++++++ proto/text_service_pb2.py | 40 ++++++++++++ proto/text_service_pb2_grpc.py | 97 ++++++++++++++++++++++++++++ requirements.txt | 9 +++ тесты.txt | 13 ++++ 22 files changed, 651 insertions(+) create mode 100644 api_app/__init__.py create mode 100644 api_app/grpc_client/__init__.py create mode 100644 api_app/grpc_client/client.py create mode 100644 api_app/migrations/0001_initial.py create mode 100644 api_app/migrations/__init__.py create mode 100644 api_app/models.py create mode 100644 api_app/services/__init__.py create mode 100644 api_app/services/scan.py create mode 100644 api_app/services/vosk_recognizer.py create mode 100644 api_app/urls.py create mode 100644 api_app/views.py create mode 100644 api_project/__init__.py create mode 100644 api_project/settings.py create mode 100644 api_project/urls.py create mode 100644 api_project/wsgi.py create mode 100644 manage.py create mode 100644 media/uploads/audio.ogg create mode 100644 proto/text_service.proto create mode 100644 proto/text_service_pb2.py create mode 100644 proto/text_service_pb2_grpc.py create mode 100644 requirements.txt create mode 100644 тесты.txt diff --git a/api_app/__init__.py b/api_app/__init__.py new file mode 100644 index 0000000..2126d76 --- /dev/null +++ b/api_app/__init__.py @@ -0,0 +1,2 @@ +# api_project/api_app/__init__.py +# Пустой файл инициализации для Python-пакета diff --git a/api_app/grpc_client/__init__.py b/api_app/grpc_client/__init__.py new file mode 100644 index 0000000..48f03f0 --- /dev/null +++ b/api_app/grpc_client/__init__.py @@ -0,0 +1,2 @@ +# api_project/api_app/grpc_client/__init__.py +# Пустой файл инициализации для Python-пакета diff --git a/api_app/grpc_client/client.py b/api_app/grpc_client/client.py new file mode 100644 index 0000000..2b1d7fe --- /dev/null +++ b/api_app/grpc_client/client.py @@ -0,0 +1,90 @@ +# api_project/api_app/grpc_client/client.py +import grpc +import os +import sys + +# Добавляем путь для импорта сгенерированных протофайлов +current_dir = os.path.dirname(os.path.abspath(__file__)) +proto_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(current_dir))), 'proto') +sys.path.append(proto_dir) + +# Пробуем импортировать сгенерированные протофайлы +# Если не получится, используем заглушки +try: + import text_service_pb2 + import text_service_pb2_grpc + print("Успешно импортированы сгенерированные proto файлы") +except ImportError: + print("Не удалось импортировать сгенерированные proto файлы, используем заглушки") + + # Создаем заглушки + class TextRequest: + def __init__(self, text): + self.text = text + + class TextResponse: + def __init__(self, processed_text, success, error): + self.processed_text = processed_text + self.success = success + self.error = error + + class TextProcessorStub: + def __init__(self, channel): + self.channel = channel + + def ProcessText(self, request): + # Эмулируем ответ от gRPC сервера + return TextResponse( + processed_text=f"ЗАГЛУШКА ОБРАБОТКИ ТЕКСТА: {request.text}", + success=True, + error="" + ) + + # Создаем модуль заглушки + class text_service_pb2: + TextRequest = TextRequest + TextResponse = TextResponse + + class text_service_pb2_grpc: + TextProcessorStub = TextProcessorStub + +def send_to_grpc_server(text: str) -> dict: + """ + Отправляет текст на gRPC сервер для обработки + + Args: + text: Текст для обработки + + Returns: + dict: Результат обработки + """ + try: + # Создаем соединение с сервером + # Для заглушки это не обязательно, но оставим для совместимости + try: + channel = grpc.insecure_channel('localhost:50051') + except NameError: + # Если grpc не импортирован, используем заглушку + channel = "dummy_channel" + + # Создаем клиент + stub = text_service_pb2_grpc.TextProcessorStub(channel) + + # Создаем запрос + request = text_service_pb2.TextRequest(text=text) + + # Отправляем запрос + response = stub.ProcessText(request) + + # Возвращаем результат + return { + 'processed_text': response.processed_text, + 'success': response.success, + 'error': response.error if hasattr(response, 'error') and response.error else None + } + except Exception as e: + return { + 'processed_text': None, + 'success': False, + 'error': str(e) + } diff --git a/api_app/migrations/0001_initial.py b/api_app/migrations/0001_initial.py new file mode 100644 index 0000000..1cca455 --- /dev/null +++ b/api_app/migrations/0001_initial.py @@ -0,0 +1,33 @@ +# Generated by Django 5.1.3 on 2025-05-06 12:35 + +import api_app.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='AudioFile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('file', models.FileField(upload_to=api_app.models.get_file_path)), + ('uploaded_at', models.DateTimeField(auto_now_add=True)), + ('processed_text', models.TextField(blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='DocumentFile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('file', models.FileField(upload_to=api_app.models.get_file_path)), + ('uploaded_at', models.DateTimeField(auto_now_add=True)), + ('processed_text', models.TextField(blank=True, null=True)), + ], + ), + ] diff --git a/api_app/migrations/__init__.py b/api_app/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api_app/models.py b/api_app/models.py new file mode 100644 index 0000000..74f9482 --- /dev/null +++ b/api_app/models.py @@ -0,0 +1,25 @@ +# api_project/api_app/models.py +from django.db import models +import uuid +import os + +def get_file_path(instance, filename): + ext = filename.split('.')[-1] + filename = f"{uuid.uuid4()}.{ext}" + return os.path.join('uploads', filename) + +class AudioFile(models.Model): + file = models.FileField(upload_to=get_file_path) + uploaded_at = models.DateTimeField(auto_now_add=True) + processed_text = models.TextField(blank=True, null=True) + + def __str__(self): + return f"Audio {self.id} - {self.uploaded_at}" + +class DocumentFile(models.Model): + file = models.FileField(upload_to=get_file_path) + uploaded_at = models.DateTimeField(auto_now_add=True) + processed_text = models.TextField(blank=True, null=True) + + def __str__(self): + return f"Document {self.id} - {self.uploaded_at}" diff --git a/api_app/services/__init__.py b/api_app/services/__init__.py new file mode 100644 index 0000000..ae36dba --- /dev/null +++ b/api_app/services/__init__.py @@ -0,0 +1,2 @@ +# api_project/api_app/services/__init__.py +# Пустой файл инициализации для Python-пакета diff --git a/api_app/services/scan.py b/api_app/services/scan.py new file mode 100644 index 0000000..513ed6f --- /dev/null +++ b/api_app/services/scan.py @@ -0,0 +1,66 @@ +import pdfplumber +import docx +import csv +import os +from io import StringIO, BytesIO +from PIL import Image +import base64 + + +def extract_text_tables(file_path: str) -> str: + result = "" + if file_path.endswith(".pdf"): + with pdfplumber.open(file_path) as pdf: + for page in pdf.pages: + text = page.extract_text() + if text: + result += "

" + text.replace("\n", "

") + "

" + + tables = page.extract_tables() + if tables: + for table in tables: + csv_output = StringIO() + csv_writer = csv.writer(csv_output) + csv_writer.writerows(table) + result += f"
{csv_output.getvalue()}
" + + # Извлечение изображений + if page.images: + for img in page.images: + img_data = img["stream"].get_data() + encoded_img = base64.b64encode(img_data).decode("utf-8") + result += f'' + + elif file_path.endswith(".docx"): + doc = docx.Document(file_path) + + text_data = [] + table_data = [] + image_data = [] + + for para in doc.paragraphs: + if para.text.strip(): + text_data.append(f"

{para.text}

") + + for table in doc.tables: + csv_output = StringIO() + csv_writer = csv.writer(csv_output) + for row in table.rows: + csv_writer.writerow([cell.text.strip() for cell in row.cells]) + table_data.append(f"
{csv_output.getvalue()}
") + + # Извлечение изображений + for rel in doc.part.rels: + if "image" in doc.part.rels[rel].target_ref: + image_data_blob = doc.part.rels[rel].target_part.blob + encoded_img = base64.b64encode(image_data_blob).decode("utf-8") + image_data.append(f'') + + if text_data: + result += "".join(text_data) + if table_data: + result += "".join(table_data) + if image_data: + result += "".join(image_data) + + return result diff --git a/api_app/services/vosk_recognizer.py b/api_app/services/vosk_recognizer.py new file mode 100644 index 0000000..da99f44 --- /dev/null +++ b/api_app/services/vosk_recognizer.py @@ -0,0 +1,51 @@ +import os, wave, vosk, ffmpeg + +MODEL_PATH = r"models/vosk-model-small-ru-0.22" +FFMPEG_PATH = r"models/ffmpeg/bin/ffmpeg.exe" + +def convert_audio_to_wav(input_file, output_file, FFMPEG_PATH): + try: + ( + ffmpeg + .input(input_file) + .output(output_file, format='wav', acodec='pcm_s16le', ar='16000', ac=1, + af='acompressor,afftdn,dynaudnorm,aresample=16000') # 16kHz для Vosk + .global_args('-loglevel', 'quiet') + .run(cmd=FFMPEG_PATH, overwrite_output=True) + ) + print(f"Конвертация завершена: {output_file}") + except ffmpeg.Error as e: + print("Ошибка при конвертации:", e.stderr.decode()) + + +vosk.SetLogLevel(-1) + +def recognize_speech(audio_path) -> str: + if not os.path.exists(MODEL_PATH): + print("Ошибка: Модель не найдена!") + return "" + + model = vosk.Model(MODEL_PATH) + + if audio_path.split('.')[-1] != "wav": + convert.convert_audio_to_wav(audio_path, "audio.wav", FFMPEG_PATH) + audio_path = "audio.wav" + else: + with wave.open(audio_path, "rb") as wf: + if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getframerate() != 16000: + convert.convert_audio_to_wav(audio_path, "audio.wav", FFMPEG_PATH) + audio_path = "audio.wav" + + + with wave.open(audio_path, "rb") as wf: # использование vosk + recognizer = vosk.KaldiRecognizer(model, wf.getframerate()) + while True: + data = wf.readframes(3200) + if not data: + break + recognizer.AcceptWaveform(data) + + if audio_path == "audio.wav": + os.remove(audio_path) + + return recognizer.FinalResult().split(": \"")[-1][:-3] diff --git a/api_app/urls.py b/api_app/urls.py new file mode 100644 index 0000000..772fd41 --- /dev/null +++ b/api_app/urls.py @@ -0,0 +1,8 @@ +# api_project/api_app/urls.py +from django.urls import path +from .views import AudioToTextView, DocumentToTextView + +urlpatterns = [ + path('audio-to-text/', AudioToTextView.as_view(), name='audio-to-text'), + path('document-to-text/', DocumentToTextView.as_view(), name='document-to-text'), +] diff --git a/api_app/views.py b/api_app/views.py new file mode 100644 index 0000000..eb820ad --- /dev/null +++ b/api_app/views.py @@ -0,0 +1,77 @@ +# api_project/api_app/views.py +import os +from rest_framework import status +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework.parsers import MultiPartParser, FormParser +from django.conf import settings + +from .models import AudioFile, DocumentFile +from .services.vosk_recognizer import recognize_speech +from .services.scan import extract_text_tables +from .grpc_client.client import send_to_grpc_server + +class AudioToTextView(APIView): + parser_classes = (MultiPartParser, FormParser) + + def post(self, request, *args, **kwargs): + audio_file = request.FILES.get('audio') + + if not audio_file: + return Response({'error': 'Нет аудио файла'}, status=status.HTTP_400_BAD_REQUEST) + + audio_model = AudioFile(file=audio_file) + audio_model.save() + + try: + file_path = os.path.join(settings.MEDIA_ROOT, audio_model.file.name) + + text = recognize_speech(file_path) + + audio_model.processed_text = text + audio_model.save() + + grpc_response = send_to_grpc_server(text) + + return Response({ + 'text': text, + 'grpc_response': grpc_response + }, status=status.HTTP_200_OK) + + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + +class DocumentToTextView(APIView): + parser_classes = (MultiPartParser, FormParser) + + def post(self, request, *args, **kwargs): + document_file = request.FILES.get('document') + + if not document_file: + return Response({'error': 'Нет документа'}, status=status.HTTP_400_BAD_REQUEST) + + file_ext = os.path.splitext(document_file.name)[1].lower() + if file_ext not in ['.pdf', '.docx']: + return Response({'error': 'Поддерживаются только PDF и DOCX файлы'}, + status=status.HTTP_400_BAD_REQUEST) + + doc_model = DocumentFile(file=document_file) + doc_model.save() + + try: + file_path = os.path.join(settings.MEDIA_ROOT, doc_model.file.name) + + text = extract_text_tables(file_path) + + doc_model.processed_text = text + doc_model.save() + + grpc_response = send_to_grpc_server(text) + + return Response({ + 'text': text, + 'grpc_response': grpc_response + }, status=status.HTTP_200_OK) + + except Exception as e: + return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) \ No newline at end of file diff --git a/api_project/__init__.py b/api_project/__init__.py new file mode 100644 index 0000000..3f63b69 --- /dev/null +++ b/api_project/__init__.py @@ -0,0 +1,2 @@ +# api_project/api_project/__init__.py +# Пустой файл инициализации для Python-пакета diff --git a/api_project/settings.py b/api_project/settings.py new file mode 100644 index 0000000..58e6a56 --- /dev/null +++ b/api_project/settings.py @@ -0,0 +1,69 @@ +import os +from pathlib import Path + +BASE_DIR = Path(__file__).resolve().parent.parent + +SECRET_KEY = 'django-insecure-)+yykzv8cr7dbc38g2#x(8*ifs@+-f_fyan9!c%mmxg1$ekztq' + +DEBUG = True + +ALLOWED_HOSTS = [] + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + # 'django.contrib.staticfiles', + 'rest_framework', # Добавляем DRF + 'api_app', # Наше API приложение +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'api_project.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'api_project.wsgi.application' + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + +# Путь для загрузки файлов +MEDIA_URL = '/media/' +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') + +# Настройки для REST Framework +REST_FRAMEWORK = { + 'DEFAULT_PERMISSION_CLASSES': [ + 'rest_framework.permissions.AllowAny', # Для тестирования, в продакшне лучше ограничить + ] +} diff --git a/api_project/urls.py b/api_project/urls.py new file mode 100644 index 0000000..eae7c34 --- /dev/null +++ b/api_project/urls.py @@ -0,0 +1,13 @@ +# api_project/api_project/urls.py +from django.contrib import admin +from django.urls import path, include +from django.conf import settings +from django.conf.urls.static import static + +urlpatterns = [ + path('admin/', admin.site.urls), + path('api/', include('api_app.urls')), +] + +if settings.DEBUG: + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/api_project/wsgi.py b/api_project/wsgi.py new file mode 100644 index 0000000..47d233a --- /dev/null +++ b/api_project/wsgi.py @@ -0,0 +1,14 @@ +# api_project/api_project/wsgi.py +""" +WSGI config for api_project project. + +It exposes the WSGI callable as a module-level variable named ``application``. +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'api_project.settings') + +application = get_wsgi_application() diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..3c82615 --- /dev/null +++ b/manage.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'api_project.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/media/uploads/audio.ogg b/media/uploads/audio.ogg new file mode 100644 index 0000000000000000000000000000000000000000..916885e615d34ad6c9894c6967e549abd765cdcc GIT binary patch literal 98293 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%0Dgi;vC|2%di+a*Z68PKPZ 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 z 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�G-J(NUik281ThS@sdprQR?@T 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 literal 0 HcmV?d00001 diff --git a/proto/text_service.proto b/proto/text_service.proto new file mode 100644 index 0000000..b69f11d --- /dev/null +++ b/proto/text_service.proto @@ -0,0 +1,18 @@ +// proto/text_service.proto +syntax = "proto3"; + +package text_service; + +service TextProcessor { + rpc ProcessText(TextRequest) returns (TextResponse) {} +} + +message TextRequest { + string text = 1; +} + +message TextResponse { + string processed_text = 1; + bool success = 2; + string error = 3; +} diff --git a/proto/text_service_pb2.py b/proto/text_service_pb2.py new file mode 100644 index 0000000..6311ce1 --- /dev/null +++ b/proto/text_service_pb2.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: text_service.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'text_service.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12text_service.proto\x12\x0ctext_service\"\x1b\n\x0bTextRequest\x12\x0c\n\x04text\x18\x01 \x01(\t\"F\n\x0cTextResponse\x12\x16\n\x0eprocessed_text\x18\x01 \x01(\t\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\r\n\x05\x65rror\x18\x03 \x01(\t2W\n\rTextProcessor\x12\x46\n\x0bProcessText\x12\x19.text_service.TextRequest\x1a\x1a.text_service.TextResponse\"\x00\x62\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'text_service_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + DESCRIPTOR._loaded_options = None + _globals['_TEXTREQUEST']._serialized_start=36 + _globals['_TEXTREQUEST']._serialized_end=63 + _globals['_TEXTRESPONSE']._serialized_start=65 + _globals['_TEXTRESPONSE']._serialized_end=135 + _globals['_TEXTPROCESSOR']._serialized_start=137 + _globals['_TEXTPROCESSOR']._serialized_end=224 +# @@protoc_insertion_point(module_scope) diff --git a/proto/text_service_pb2_grpc.py b/proto/text_service_pb2_grpc.py new file mode 100644 index 0000000..4f08cdc --- /dev/null +++ b/proto/text_service_pb2_grpc.py @@ -0,0 +1,97 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + +import text_service_pb2 as text__service__pb2 + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in text_service_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class TextProcessorStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.ProcessText = channel.unary_unary( + '/text_service.TextProcessor/ProcessText', + request_serializer=text__service__pb2.TextRequest.SerializeToString, + response_deserializer=text__service__pb2.TextResponse.FromString, + _registered_method=True) + + +class TextProcessorServicer(object): + """Missing associated documentation comment in .proto file.""" + + def ProcessText(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_TextProcessorServicer_to_server(servicer, server): + rpc_method_handlers = { + 'ProcessText': grpc.unary_unary_rpc_method_handler( + servicer.ProcessText, + request_deserializer=text__service__pb2.TextRequest.FromString, + response_serializer=text__service__pb2.TextResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'text_service.TextProcessor', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('text_service.TextProcessor', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class TextProcessor(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def ProcessText(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/text_service.TextProcessor/ProcessText', + text__service__pb2.TextRequest.SerializeToString, + text__service__pb2.TextResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..32690df --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +django==4.2.6 +djangorestframework==3.14.0 +grpcio==1.58.0 +grpcio-tools==1.58.0 +pdfplumber==0.10.2 +python-docx==0.8.11 +Pillow==10.0.1 +vosk==0.3.45 +ffmpeg-python==0.2.0 diff --git a/тесты.txt b/тесты.txt new file mode 100644 index 0000000..c3da715 --- /dev/null +++ b/тесты.txt @@ -0,0 +1,13 @@ +python manage.py runserver + +------------------------------------------ + +Тест расширения для сканирования: + +curl -X POST -F "document=@C:\Users\egord\Desktop\API EasyAccess\api_project\media\uploads\Деев Е.В. Резюме.pdf" http://localhost:8000/api/document-to-text/ + +------------------------------------------ + +Тест для аудио транскрипции: + +curl -X POST -F audio=@"C:\Users\egord\Desktop\API EasyAccess\api_project\media\uploads\audio.ogg" http://localhost:8000/api/audio-to-text/ \ No newline at end of file