Mintik24 commited on
Commit
3cda35c
·
1 Parent(s): 0e1f8e5
README.md CHANGED
@@ -1,115 +1,84 @@
1
  # Trans for Doctors - Установка и использование
2
 
3
- ## Быстрый старт
4
 
5
- ### 1. Установка с помощью UV (рекомендуется)
6
-
7
- #### Предварительные требования:
8
- - Python 3.13+
9
  - Git
10
-
11
- #### Шаги установки:
12
-
13
- 1. **Установите `uv` (если еще не установлен)**
14
- ```bash
15
- # На macOS/Linux
16
- curl -LsSf https://astral.sh/uv/install.sh | sh
17
-
18
- # На Windows (PowerShell)
19
- powershell -ExecutionPolicy BypassUser -c "irm https://astral.sh/uv/install.ps1 | iex"
20
- ```
21
-
22
- 2. **Клонируйте репозиторий**
23
- ```bash
24
- git clone <ваш-репозиторий>
25
- cd Trans_for_doctors
26
- ```
27
-
28
- 3. **Создайте виртуальное окружение и установите зависимости**
29
- ```bash
30
- uv venv
31
- source .venv/bin/activate # На Windows: .venv\Scripts\activate
32
- uv pip install -r requirements.txt
33
- ```
34
-
35
- ### 2. Скачивание моделей с Hugging Face
36
-
37
- #### Вариант A: Автоматическое скачивание (встроено в скрипт)
38
- Скрипт `run_demo.py` автоматически скачает необходимые модели с Hugging Face при первом запуске.
39
-
40
- #### Вариант B: Ручное скачивание
41
-
42
- 1. **Установите `huggingface-hub`**
43
- ```bash
44
- uv pip install huggingface-hub
45
- ```
46
-
47
- 2. **Скачайте модель для текстового трансляра**
48
- ```bash
49
- huggingface-cli download <модель-название> --local-dir ./models/translator
50
- ```
51
-
52
- 3. **Скачайте модель для распознавания речи (Whisper)**
53
- ```bash
54
- huggingface-cli download openai/whisper-base --local-dir ./models/whisper
55
- ```
56
-
57
- ### 3. Запуск проекта
58
 
59
  ```bash
60
- # Убедитесь, что виртуальное окружение активно
61
- source .venv/bin/activate # На Windows: .venv\Scripts\activate
62
 
63
- # Запустите демо
64
- uv run python run_demo.py
65
  ```
66
 
67
- ## Структура проекта
68
-
69
- - `run_demo.py` - основной скрипт для запуска
70
- - `requirements.txt` - зависимости проекта
71
- - Папка `models/` - где хранятся скачанные модели (создается автоматически)
72
- - Конфигурационные файлы (`config.json`, `generation_config.json` и т.д.)
73
- - `medical_terms.txt` - медицинская терминология
74
- - `vocab.json`, `merges.txt` - файлы токенайзера
75
-
76
- ## Необходимые пакеты
77
-
78
- - **transformers** - работа с трансформер моделями
79
- - **accelerate** - оптимизация при работе с GPU
80
- - **librosa** - обработка аудио
81
- - **soundfile** - сохранение аудио файлов
82
- - **huggingface_hub** - скачивание моделей с Hugging Face
83
- - **numpy** - численные вычисления
84
-
85
- ## Альтернатива: PIP вместо UV
86
 
87
- Если вы предпочитаете использовать стандартный pip:
 
 
 
88
 
 
 
89
  ```bash
90
- python -m venv venv
91
- source venv/bin/activate # На Windows: venv\Scripts\activate
92
- pip install -r requirements.txt
93
- python run_demo.py
 
 
 
 
 
 
 
 
94
  ```
95
 
96
- ## Решение проблем
97
-
98
- ### Проблема: "Model not found on Hugging Face"
99
- **Решение:** Проверьте интернет соединение и убедитесь, что вы вошли в свой аккаунт:
100
  ```bash
101
- huggingface-cli login
 
 
 
 
102
  ```
103
 
104
- ### Проблема: "CUDA out of memory"
105
- **Решение:** Используйте CPU вместо GPU или снизьте размер batch:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
  ```bash
107
- export CUDA_VISIBLE_DEVICES="" # Принудительно использовать CPU
 
 
108
  python run_demo.py
109
  ```
110
 
111
- ### Проблема: "Нет прав для записи в папку models"
112
- **Решение:** Убедитесь, что у вас есть права на запись в текущую директорию
113
- ```bash
114
- chmod -R 755 ./
115
- ```
 
1
  # Trans for Doctors - Установка и использование
2
 
3
+ ## Быстрый старт (UV)
4
 
5
+ ### Предварительные требования
6
+ - Python 3.13+ (torch GPU колеса требуют совместимую версию)
 
 
7
  - Git
8
+ - Установленный менеджер uv
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
  ```bash
11
+ # macOS/Linux
12
+ curl -LsSf https://astral.sh/uv/install.sh | sh
13
 
14
+ # Windows (PowerShell)
15
+ powershell -ExecutionPolicy BypassUser -c "irm https://astral.sh/uv/install.ps1 | iex"
16
  ```
17
 
18
+ ### Установка
19
+ ```bash
20
+ git clone <ваш-репозиторий>
21
+ cd Trans_for_doctors
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
+ # uv сам создаст .venv и установит зависимости из pyproject.toml
24
+ uv sync
25
+ source .venv/bin/activate # Windows: .venv\Scripts\activate
26
+ ```
27
 
28
+ ### Подготовка CUDA (опционально)
29
+ uv sync ставит базовый torch. Для GPU поставьте колесо под свою версию CUDA 13.0:
30
  ```bash
31
+ # CUDA 13.0 (cu130)
32
+ uv pip install --upgrade \
33
+ --index-url https://download.pytorch.org/whl/cu130 \
34
+ torch torchvision torchaudio
35
+ ```
36
+ Проверка GPU:
37
+ ```bash
38
+ uv run python - <<'PY'
39
+ import torch
40
+ print(torch.cuda.is_available())
41
+ print(torch.cuda.device_name(0) if torch.cuda.is_available() else "cpu")
42
+ PY
43
  ```
44
 
45
+ ### Запуск
 
 
 
46
  ```bash
47
+ uv run python run_demo.py \
48
+ --device auto \
49
+ --dtype float32 \
50
+ --medical-prompt medical_terms.txt \
51
+ --audio test_sound_ru.wav
52
  ```
53
 
54
+ - --device auto выберет CUDA если доступно, иначе CPU.
55
+ - Для GPU: --device cuda --dtype float32
56
+ - Для CPU: --device cpu --dtype float32.
57
+
58
+ ## Структура проекта
59
+ - run_demo.py — основной скрипт
60
+ - pyproject.toml — зависимости для uv
61
+ - requirements.txt — совместимость для pip
62
+ - Конфиги модели (config.json, generation_config.json, tokenizer_config.json и т.д.)
63
+ - medical_terms.txt — медицинская терминология
64
+ - Логи и результаты — папки logs/ и results/
65
+
66
+ ## CLI параметры
67
+ - --audio — путь к аудиофайлу (по умолчанию test_sound_ru.wav)
68
+ - --medical-prompt — путь к файлу терминов
69
+ - --language — код языка (по умолчанию ru)
70
+ - --device — auto | cuda | cpu
71
+ - --dtype — auto | float32 | float16 | bfloat16
72
+
73
+ ## Альтернатива: pip без uv
74
  ```bash
75
+ python -m venv venv
76
+ source venv/bin/activate # Windows: venv\Scripts\activate
77
+ pip install -r requirements.txt
78
  python run_demo.py
79
  ```
80
 
81
+ ## Решение проблем
82
+ - Модель не скачивается: проверьте сеть и выполните huggingface-cli login.
83
+ - CUDA OOM: запустите на CPU (--device cpu) или используйте float16 на меньшей карте.
84
+ - Нет прав записи: убедитесь, что у вас есть права на каталог (chmod -R 755 ./).
 
logs/transcription_20260114_203107.log ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ 2026-01-14 20:31:07,487 - whisper_demo - INFO - Starting Whisper transcription demo
2
+ 2026-01-14 20:31:07,488 - whisper_demo - INFO - Audio file: /home/robot/Documents/novaya_vetka/5415689602587464150.wav
3
+ 2026-01-14 20:31:08,118 - whisper_demo - INFO - Audio loaded successfully, sample rate: 16000
4
+ 2026-01-14 20:31:08,119 - whisper_demo - INFO - Inference device: cpu
5
+ 2026-01-14 20:31:08,119 - whisper_demo - INFO - torch dtype: torch.float32
6
+ 2026-01-14 20:31:08,119 - whisper_demo - INFO - Loading model from /home/robot/Documents/novaya_vetka/Trans_for_doctors
7
+ 2026-01-14 20:31:08,485 - whisper_demo - INFO - Language: ru
8
+ 2026-01-14 20:31:08,485 - whisper_demo - INFO - Starting transcription...
9
+ 2026-01-14 20:32:45,659 - whisper_demo - INFO - Transcription completed successfully
10
+ 2026-01-14 20:32:45,661 - whisper_demo - INFO - Result saved to /home/robot/Documents/novaya_vetka/Trans_for_doctors/results/result_20260114_203245.json
pyproject.toml ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "trans-for-doctors"
3
+ version = "0.1.0"
4
+ description = "Whisper-based transcription demo with optional medical prompts"
5
+ readme = "README.md"
6
+ requires-python = ">=3.13,<3.14"
7
+ dependencies = [
8
+ "transformers>=4.44.0",
9
+ "torch>=2.3.0",
10
+ "torchvision>=0.18.1",
11
+ "torchaudio>=2.3.1",
12
+ "accelerate>=0.33.0",
13
+ "librosa>=0.10.2",
14
+ "soundfile>=0.12.1",
15
+ "huggingface_hub>=0.23.4",
16
+ "numpy>=1.26.4",
17
+ "wget>=3.2",
18
+ ]
19
+
20
+ [build-system]
21
+ requires = ["hatchling"]
22
+ build-backend = "hatchling.build"
23
+
requirements.txt CHANGED
@@ -1,4 +1,7 @@
1
  transformers>=4.44.0
 
 
 
2
  accelerate>=0.33.0
3
  librosa>=0.10.2
4
  soundfile>=0.12.1
 
1
  transformers>=4.44.0
2
+ torch>=2.3.0
3
+ torchvision>=0.18.1
4
+ torchaudio>=2.3.1
5
  accelerate>=0.33.0
6
  librosa>=0.10.2
7
  soundfile>=0.12.1
results/result_20260114_203245.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "timestamp": "2026-01-14T20:32:45.660736",
3
+ "audio_file": "5415689602587464150.wav",
4
+ "language": "ru",
5
+ "medical_prompt_used": false,
6
+ "transcription": " На серии МР-томограмм, выполненных в двух проекциях, лордоз сохранен просвет позвоночного канала на уровне L3 позвонка 1,6 сантиметров, высота межпозвонкового диска L5-S1 и интенсивность сигнала от него и диска L4-L5-BOTO2 снижены, высота и интенсивность сигнала от остальных межпозвонковых дисков исследованной зоны сохранены. Определяется дорзальная медиально-парамедиальная грыжа диска по типу протрузии L4 и L5 размером 0,5 см, умеренно деформирующая прилежащий отдел латурального мешка, распространяющийся в оба мешково-звонковых отверстия с их сужением большей степени правого и левого. На уровне Л5-С1 определяется дарзальная левосторонняя медиально-парамедиальная грыжа по типу экструзии размером до 1,0 сантиметров компримирующий прилежащий отдел дурального мешка, распространяющийся в левое межпозвонковое отверстие с его сужением и компрессией левого нервного корешка.Кровые и костные разрастания L4-С1, дефекты шморны L5-С1."
7
+ }
run_demo.py CHANGED
@@ -110,6 +110,8 @@ def main() -> None:
110
  parser.add_argument("--audio", type=str, default=str(AUDIO_FILE), help="Path to audio file")
111
  parser.add_argument("--medical-prompt", type=str, help="Path to medical terms file (e.g., medical_terms.txt)")
112
  parser.add_argument("--language", type=str, default="ru", help="Language code (default: ru)")
 
 
113
  args = parser.parse_args()
114
 
115
  audio_path = Path(args.audio)
@@ -121,19 +123,56 @@ def main() -> None:
121
  except Exception as e:
122
  logger.error(f"Failed to load audio file: {e}")
123
  raise
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
 
125
  # Load processor to access prompt tokenization
126
  logger.info(f"Loading model from {MODEL_PATH}")
127
  processor = AutoProcessor.from_pretrained(str(MODEL_PATH))
128
 
129
- asr = pipeline(
130
- task="automatic-speech-recognition",
131
- model=str(MODEL_PATH),
132
- tokenizer=processor.tokenizer,
133
- feature_extractor=processor.feature_extractor,
134
- device_map="auto",
135
- torch_dtype=torch.float32,
136
- )
 
 
 
 
 
 
137
 
138
  # Prepare generation kwargs
139
  generate_kwargs = {
 
110
  parser.add_argument("--audio", type=str, default=str(AUDIO_FILE), help="Path to audio file")
111
  parser.add_argument("--medical-prompt", type=str, help="Path to medical terms file (e.g., medical_terms.txt)")
112
  parser.add_argument("--language", type=str, default="ru", help="Language code (default: ru)")
113
+ parser.add_argument("--device", choices=["auto", "cuda", "cpu"], default="auto", help="Inference device (auto prefers CUDA if available)")
114
+ parser.add_argument("--dtype", choices=["auto", "float32", "float16", "bfloat16"], default="float32", help="Torch dtype (default float32; use float16 only if desired)")
115
  args = parser.parse_args()
116
 
117
  audio_path = Path(args.audio)
 
123
  except Exception as e:
124
  logger.error(f"Failed to load audio file: {e}")
125
  raise
126
+
127
+ # Resolve device and dtype
128
+ device_choice = args.device
129
+ if device_choice == "cuda" and not torch.cuda.is_available():
130
+ logger.warning("CUDA requested but not available; falling back to CPU")
131
+ device_choice = "cpu"
132
+
133
+ if device_choice == "auto":
134
+ torch_device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
135
+ device_map = "auto" if torch_device.type == "cuda" else None
136
+ elif device_choice == "cuda":
137
+ torch_device = torch.device("cuda")
138
+ device_map = None
139
+ else:
140
+ torch_device = torch.device("cpu")
141
+ device_map = None
142
+
143
+ if args.dtype == "auto":
144
+ torch_dtype = torch.float32
145
+ else:
146
+ dtype_map = {
147
+ "float32": torch.float32,
148
+ "float16": torch.float16,
149
+ "bfloat16": torch.bfloat16,
150
+ }
151
+ torch_dtype = dtype_map[args.dtype]
152
+
153
+ logger.info(f"Inference device: {torch_device}")
154
+ logger.info(f"torch dtype: {torch_dtype}")
155
+ if device_map:
156
+ logger.info(f"Using device_map: {device_map}")
157
 
158
  # Load processor to access prompt tokenization
159
  logger.info(f"Loading model from {MODEL_PATH}")
160
  processor = AutoProcessor.from_pretrained(str(MODEL_PATH))
161
 
162
+ pipeline_kwargs = {
163
+ "task": "automatic-speech-recognition",
164
+ "model": str(MODEL_PATH),
165
+ "tokenizer": processor.tokenizer,
166
+ "feature_extractor": processor.feature_extractor,
167
+ "torch_dtype": torch_dtype,
168
+ }
169
+
170
+ if device_map:
171
+ pipeline_kwargs["device_map"] = device_map
172
+ else:
173
+ pipeline_kwargs["device"] = torch_device
174
+
175
+ asr = pipeline(**pipeline_kwargs)
176
 
177
  # Prepare generation kwargs
178
  generate_kwargs = {