VoiceTranscriptionBlock
Panoramica
VoiceTranscriptionBlock registra una riunione dal microfono, la trascrive e la riassume (dalla 2.17.0). Ha tre schede:
- Note — data, partecipanti e ordine del giorno, da compilare prima della riunione;
- Trascrizione — il testo trascritto, a cui le registrazioni successive si accodano;
- Riassunto — generato dopo ogni trascrizione e modificabile, con la condivisione via email.
Avvia / Interrompi registrazione chiede il microfono. Se è negato, assente o il browser non registra audio, il blocco lo dice. Oltre recommendedMinutes compare un avviso, ma la registrazione continua.
La libreria non conosce il servizio di trascrizione: lo raggiungono le funzioni transcribe e summarize del modulo, che sanno anche a quale record appartiene il blocco.
Anteprima live (con transcribe e summarize mockate)
L'anteprima usa il microfono vero: il browser chiede il permesso. La trascrizione è simulata e non invia l'audio da nessuna parte.
In TiptapEditor: «/Trascrizione vocale»
Con l'opzione voiceTranscription, in TiptapEditor il comando / e il pulsante col microfono nella toolbar inseriscono il blocco nel documento:
<TiptapEditor
v-model="nota"
:voice-transcription="{
transcribe: (audio, lingua) => ai.trascrivi(audio, lingua, idrecord),
summarize: testo => ai.riassumi(testo),
language: 'it',
recommendedMinutes: 60,
}"
/>
Nel documento il blocco è un <div data-voice-transcription="{…}">: l'attributo conserva note, trascrizione e riassunto; dentro c'è una versione leggibile per chi mostra l'HTML senza editor. Serve la peer opzionale @tiptap/suggestion.
Utilizzo diretto
<script setup lang="ts">
import { ref } from 'vue'
import { VoiceTranscriptionBlock } from '@pzeta/vue-form'
import type { VoiceTranscriptionValue } from '@pzeta/vue-form'
const riunione = ref<Partial<VoiceTranscriptionValue>>({})
</script>
<template>
<VoiceTranscriptionBlock
v-model="riunione"
language="it"
:recommended-minutes="60"
:transcribe="audio => ai.trascrivi(audio, idrecord)"
:summarize="testo => ai.riassumi(testo)"
@transcribed="risultato => log(risultato.tokens)"
>
<template #summary-actions="{ value }">
<Button label="Crea attività" size="small" text @click="creaAttivita(value.summary)" />
</template>
</VoiceTranscriptionBlock>
</template>
Contenuto
interface VoiceTranscriptionValue {
agenda: string // ordine del giorno
participants: string // partecipanti
meetingDate: string // 'YYYY-MM-DD'
transcript: string // le registrazioni successive si accodano
summary: string // modificabile
language: string // lingua rilevata dall'ultima trascrizione
durationSeconds: number // durata complessiva delle registrazioni
}
interface VoiceTranscriptionResult {
text: string
language: string
tokens: number
}
Props
| Prop | Tipo | Default | Descrizione |
|---|---|---|---|
modelValue | Partial<VoiceTranscriptionValue> | {} | Contenuto del blocco (v-model) |
transcribe | (audio: Blob, language?: string) => Promise<VoiceTranscriptionResult> | — | Richiesta. Trascrive l'audio registrato |
summarize | (text: string) => Promise<string> | — | Riassume la trascrizione; senza, il riassunto resta manuale |
language | string | — | Lingua predefinita passata a transcribe |
recommendedMinutes | number | 0 | Durata consigliata: oltre, un avviso non bloccante |
share | (value: VoiceTranscriptionValue) => void | — | Condivisione del riassunto; senza, un link mailto: |
readonly | boolean | false | Niente registrazione, campi in sola lettura |
removable | boolean | false | Pulsante per togliere il blocco (lo usa l'editor) |
Eventi
| Evento | Payload | Descrizione |
|---|---|---|
update:modelValue | VoiceTranscriptionValue | Contenuto aggiornato |
started | — | Registrazione avviata |
stopped | number | Registrazione fermata: durata in secondi |
transcribed | VoiceTranscriptionResult | Trascrizione riuscita |
error | string | Microfono non disponibile o operazione fallita |
remove | — | Richiesta di togliere il blocco (removable) |
Slot
| Slot | Slot props | Descrizione |
|---|---|---|
notes | { value, update } | Sostituisce la scheda Note; update(patch) scrive nel contenuto |
summary-actions | { value } | Azioni aggiuntive accanto al riassunto |
Vedi anche
useAudioRecorder— la registrazione usata dal blocco, per chi vuole costruirne uno diverso