@medc-com-br/ngx-jaimes-scribe 0.1.8 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -13
- package/fesm2022/medc-com-br-ngx-jaimes-scribe.mjs +569 -313
- package/fesm2022/medc-com-br-ngx-jaimes-scribe.mjs.map +1 -1
- package/lib/components/recorder/recorder.component.d.ts +17 -25
- package/lib/services/playback.service.d.ts +33 -0
- package/lib/services/speaker-identification.service.d.ts +32 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,16 +5,16 @@ Biblioteca Angular para transcrição de áudio em tempo real com suporte a diar
|
|
|
5
5
|
## Instalação
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install @
|
|
8
|
+
npm install @medc-com-br/ngx-jaimes-scribe
|
|
9
9
|
# ou
|
|
10
|
-
pnpm add @
|
|
10
|
+
pnpm add @medc-com-br/ngx-jaimes-scribe
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
## Uso Básico
|
|
14
14
|
|
|
15
15
|
```typescript
|
|
16
16
|
import { Component } from '@angular/core';
|
|
17
|
-
import { RecorderComponent } from '@
|
|
17
|
+
import { RecorderComponent } from '@medc-com-br/ngx-jaimes-scribe';
|
|
18
18
|
|
|
19
19
|
@Component({
|
|
20
20
|
selector: 'app-consultation',
|
|
@@ -66,8 +66,11 @@ export class ConsultationComponent {
|
|
|
66
66
|
|-------|------|-------------|---------|-----------|
|
|
67
67
|
| `wsUrl` | `string` | ✅ Sim* | - | URL do WebSocket do serviço de streaming |
|
|
68
68
|
| `token` | `string` | Não | `''` | Token JWT para autenticação |
|
|
69
|
-
| `premium` | `boolean` | Não | `false` | Ativa tier premium (
|
|
69
|
+
| `premium` | `boolean` | Não | `false` | Ativa tier premium (Deepgram Nova-3) |
|
|
70
70
|
| `speakerLabels` | `Record<number, string>` | Não | `{}` | Labels customizados para speakers |
|
|
71
|
+
| `doctorName` | `string` | Não | `''` | Nome do médico (exibido quando speaker é identificado como doctor) |
|
|
72
|
+
| `patientName` | `string` | Não | `''` | Nome do paciente (exibido quando speaker é identificado como patient) |
|
|
73
|
+
| `companionName` | `string` | Não | `''` | Nome do acompanhante (exibido quando speaker é identificado como companion) |
|
|
71
74
|
| `templates` | `TemplateOption[]` | Não | `[]` | Lista de templates para geração de documentos |
|
|
72
75
|
| `lambdaUrl` | `string` | Não | `''` | URL base do Lambda para geração de documentos |
|
|
73
76
|
| `apiUrl` | `string` | Não | `''` | URL base da API para carregar sessões anteriores |
|
|
@@ -102,12 +105,12 @@ Token JWT para autenticação. Usado tanto na conexão WebSocket quanto nas cham
|
|
|
102
105
|
#### `premium`
|
|
103
106
|
|
|
104
107
|
Quando `true`, ativa o tier premium:
|
|
105
|
-
- **Transcrição**:
|
|
108
|
+
- **Transcrição**: Deepgram Nova-3
|
|
106
109
|
- **LLM**: Claude Sonnet 4.5
|
|
107
110
|
|
|
108
111
|
Quando `false` (default):
|
|
109
112
|
- **Transcrição**: Deepgram Enhanced
|
|
110
|
-
- **LLM**: Claude
|
|
113
|
+
- **LLM**: Claude Haiku 4.5
|
|
111
114
|
|
|
112
115
|
```html
|
|
113
116
|
<!-- Tier Standard -->
|
|
@@ -142,12 +145,75 @@ speakerLabels: Record<number, string> = {
|
|
|
142
145
|
- `2`: "Pessoa 3"
|
|
143
146
|
- `3`: "Pessoa 4"
|
|
144
147
|
|
|
148
|
+
#### `doctorName`, `patientName`, `companionName`
|
|
149
|
+
|
|
150
|
+
Nomes para exibir na UI quando os speakers são identificados automaticamente. A identificação usa Claude Sonnet para analisar o conteúdo da conversa e determinar quem é médico, paciente ou acompanhante.
|
|
151
|
+
|
|
152
|
+
```html
|
|
153
|
+
<ngx-jaimes-scribe-recorder
|
|
154
|
+
[wsUrl]="wsUrl"
|
|
155
|
+
[token]="token"
|
|
156
|
+
[doctorName]="'Dr. João Silva'"
|
|
157
|
+
[patientName]="'Maria Santos'"
|
|
158
|
+
[companionName]="'José Santos'"
|
|
159
|
+
/>
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Na UI**: Exibe "Dr. João Silva", "Maria Santos", etc.
|
|
163
|
+
**Na API/Resumo**: Usa labels genéricos "Médico", "Paciente", "Acompanhante".
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Identificação Automática de Speakers
|
|
168
|
+
|
|
169
|
+
O componente identifica automaticamente quem é cada speaker (Médico, Paciente, Acompanhante) usando IA.
|
|
170
|
+
|
|
171
|
+
### Fluxo
|
|
172
|
+
|
|
173
|
+
1. **Gravação em andamento**: Diarização ativa (Deepgram retorna speaker IDs 0, 1, 2...)
|
|
174
|
+
2. **Acumulação**: Sistema aguarda 2+ speakers com pelo menos 100 caracteres cada
|
|
175
|
+
3. **Identificação automática**: Envia amostra para `/identify-speakers` → Claude Sonnet analisa contexto
|
|
176
|
+
4. **Atualização da UI**: Labels mudam de "Pessoa 1" → "Dr. João Silva" (ou "Médico" se nome não fornecido)
|
|
177
|
+
5. **Re-identificação**: Se novo speaker aparecer, identifica novamente incluindo o novo
|
|
178
|
+
|
|
179
|
+
### Correção Manual
|
|
180
|
+
|
|
181
|
+
O médico pode clicar no label de qualquer speaker para corrigir a identificação:
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
[Clica no label "Médico"]
|
|
185
|
+
↓
|
|
186
|
+
[Dropdown aparece]
|
|
187
|
+
├── 🩺 Médico
|
|
188
|
+
├── 🙋 Paciente
|
|
189
|
+
├── 👥 Acompanhante
|
|
190
|
+
└── ✏️ Outro...
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Indicador de Baixa Confiança
|
|
194
|
+
|
|
195
|
+
Quando a IA tem confiança < 70%, aparece um indicador ⚠️ para o médico revisar.
|
|
196
|
+
|
|
197
|
+
### Persistência
|
|
198
|
+
|
|
199
|
+
O mapeamento de speakers é salvo automaticamente no Jaimes (S3) e retornado via `GET /session/{sessionId}`. Não é necessário persistir no EHR.
|
|
200
|
+
|
|
201
|
+
### Labels na Geração de Anamnese
|
|
202
|
+
|
|
203
|
+
Quando o documento é gerado, o Lambda `/generate` usa os roles identificados:
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
[Médico]: Bom dia, como posso ajudá-lo?
|
|
207
|
+
[Paciente]: Doutor, estou com dor nas costas há duas semanas...
|
|
208
|
+
[Acompanhante]: Ele também tem dormido mal por causa disso.
|
|
209
|
+
```
|
|
210
|
+
|
|
145
211
|
#### `templates`
|
|
146
212
|
|
|
147
213
|
Lista de templates disponíveis para geração de documentos. O botão "Gerar Resumo" só aparece se houver templates configurados e uma sessão finalizada.
|
|
148
214
|
|
|
149
215
|
```typescript
|
|
150
|
-
import { TemplateOption } from '@
|
|
216
|
+
import { TemplateOption } from '@medc-com-br/ngx-jaimes-scribe';
|
|
151
217
|
|
|
152
218
|
templates: TemplateOption[] = [
|
|
153
219
|
{
|
|
@@ -355,7 +421,7 @@ onSessionFinished(result: { transcript: string; entries: TranscriptEntry[] }): v
|
|
|
355
421
|
Emitido após a geração bem-sucedida de um documento via Lambda.
|
|
356
422
|
|
|
357
423
|
```typescript
|
|
358
|
-
import { GeneratedDocument } from '@
|
|
424
|
+
import { GeneratedDocument } from '@medc-com-br/ngx-jaimes-scribe';
|
|
359
425
|
|
|
360
426
|
onDocumentGenerated(doc: GeneratedDocument): void {
|
|
361
427
|
console.log('Template usado:', doc.templateId);
|
|
@@ -557,7 +623,7 @@ import {
|
|
|
557
623
|
RecorderComponent,
|
|
558
624
|
TemplateOption,
|
|
559
625
|
GeneratedDocument
|
|
560
|
-
} from '@
|
|
626
|
+
} from '@medc-com-br/ngx-jaimes-scribe';
|
|
561
627
|
|
|
562
628
|
@Component({
|
|
563
629
|
selector: 'app-medical-consultation',
|
|
@@ -771,10 +837,10 @@ export class MedicalConsultationComponent {
|
|
|
771
837
|
│ ┌──────────────┐ ┌─────────────────────────────────────┐ │
|
|
772
838
|
│ │ ALB │───►│ ECS Fargate (Stream Service) │ │
|
|
773
839
|
│ └──────────────┘ │ │ │
|
|
774
|
-
│ │
|
|
775
|
-
│ │ │ Deepgram
|
|
776
|
-
│ │ │
|
|
777
|
-
│ │
|
|
840
|
+
│ │ ┌───────────────────────────────┐ │ │
|
|
841
|
+
│ │ │ Deepgram │ │ │
|
|
842
|
+
│ │ │ Nova-3 (Premium) / Enhanced │ │ │
|
|
843
|
+
│ │ └───────────────────────────────┘ │ │
|
|
778
844
|
│ │ │ │
|
|
779
845
|
│ │ ┌─────────────────────────────┐ │ │
|
|
780
846
|
│ │ │ SessionManager │ │ │
|