Components

VoiceTranscriptionBlock

Blocco di trascrizione vocale con note pre-riunione, registrazione dal microfono, trascrizione e riassunto; in TiptapEditor si inserisce con il comando «/Trascrizione vocale».

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.

L'audio non viene mai salvato. Resta in memoria fino alla trascrizione e viene rilasciato appena la trascrizione riesce. Se la trascrizione fallisce resta in memoria solo per «Riprova». Nessuna copia locale persistente. Il microfono si spegne a fine registrazione e quando il blocco viene tolto.

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

PropTipoDefaultDescrizione
modelValuePartial<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
languagestring—Lingua predefinita passata a transcribe
recommendedMinutesnumber0Durata consigliata: oltre, un avviso non bloccante
share(value: VoiceTranscriptionValue) => void—Condivisione del riassunto; senza, un link mailto:
readonlybooleanfalseNiente registrazione, campi in sola lettura
removablebooleanfalsePulsante per togliere il blocco (lo usa l'editor)

Eventi

EventoPayloadDescrizione
update:modelValueVoiceTranscriptionValueContenuto aggiornato
started—Registrazione avviata
stoppednumberRegistrazione fermata: durata in secondi
transcribedVoiceTranscriptionResultTrascrizione riuscita
errorstringMicrofono non disponibile o operazione fallita
remove—Richiesta di togliere il blocco (removable)

Slot

SlotSlot propsDescrizione
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