Entrena modelos de voz y audio con tus anotaciones
Entrena la diarización de hablantes con turnos RTTM corregidos, ajusta Whisper con transcripciones corregidas y entrena detectores de llamadas con las cajas dibujadas sobre espectrogramas.
Novedad de la v2.14.0
Este tutorial entrena modelos de voz y audio con las respuestas que dan los anotadores en Potato y devuelve la salida de cada modelo a los anotadores como preetiquetas. La página está escrita para responsables de estudios que ya corrigen transcripciones, turnos de hablantes o llamadas de animales en Potato y quieren un modelo que aprenda de esas correcciones. El camino principal importa un archivo de diarización de hablantes, hace que los anotadores corrijan los turnos de los hablantes, entrena un modelo de diarización con los turnos corregidos y exporta las correcciones como RTTM. Tres secciones más breves ajustan después Whisper con turnos de transcripción corregidos, entrenan un detector de cajas sobre espectrogramas y entrenan un etiquetador de eventos sonoros sobre la forma de onda. Para el ciclo de entrenamiento en general, lee primero la descripción general del entrenamiento de modelos, y Entrena tu primer modelo si nunca has iniciado una ejecución.
Los cuatro entrenadores de audio
Cada entrenador aprende de un tipo de esquema, y la página Training ofrece un esquema solo a los entrenadores que le corresponden:
| Entrenador | Aprende de | Modelo | Puntuación sobre ítems reservados | Instalación |
|---|---|---|---|---|
diarization | el nivel de hablantes de un esquema tiered_annotation, o un esquema audio_annotation cuyas etiquetas son hablantes | un codificador de voz, WavLM de forma predeterminada | exactitud de diarización (1 − DER) | potato-annotation[train-audio] |
whisper-asr | los turnos que los anotadores corrigieron en un esquema speech_transcript | Whisper, whisper-small de forma predeterminada | exactitud de palabras (1 − WER) | potato-annotation[train-audio] |
torchvision-detect, ultralytics-detect | las cajas de un esquema spectrogram_annotation | un detector Faster R-CNN o YOLO sobre espectrogramas renderizados | mAP con IoU 0,5 | potato-annotation[train-vision], o pip install ultralytics (AGPL-3.0) |
hf-audio-tagger | los segmentos etiquetados de un esquema audio_annotation | un codificador de voz, wav2vec 2.0 de forma predeterminada | F1 de segmentos con IoU 0,5 | potato-annotation[train-audio] |
Todo entrenador de audio lee las grabaciones de archivos en el disco del servidor que soundfile abre, por ejemplo WAV, FLAC u OGG, y MP3 con una libsndfile reciente. Una ruta como /media/meet000.wav nombra un archivo de la carpeta media/ del directorio de la tarea, la carpeta desde la que la página de anotación reproduce las grabaciones. Un ítem cuya grabación es una URL http(s) se deja fuera del entrenamiento con una advertencia. Descarga las grabaciones remotas en media/ antes de entrenar. La referencia de entrenadores lista todos los parámetros.
Instala los entrenadores en el entorno que ejecuta Potato:
pip install "potato-annotation[train-audio]"El extra [train-audio] instala PyTorch, transformers y soundfile. Los detectores de espectrogramas necesitan en su lugar [train-vision], o pip install "potato-annotation[train]" para todos los entrenadores de texto, imagen, audio y LLM a la vez. Un entrenador cuyos paquetes faltan permanece en la página Training como «not installed», con el comando que instala los paquetes.
Importar una diarización como archivo RTTM
La diarización de hablantes divide una grabación en turnos según quién habla. pyannote y NeMo escriben las diarizaciones como RTTM, un formato de texto con una línea SPEAKER por turno, y dscore y md-eval puntúan archivos RTTM. Una línea nombra el identificador de archivo de la grabación, el canal, el inicio y la duración del turno en segundos, y el hablante:
SPEAKER meet000 1 0.200 1.055 <NA> <NA> SPEAKER_01 <NA> <NA>
SPEAKER meet000 1 1.539 0.755 <NA> <NA> SPEAKER_00 <NA> <NA>Coloca los archivos RTTM y las grabaciones en una carpeta, con cada grabación nombrada según su identificador de archivo (meet000.wav para meet000), e importa la carpeta:
potato import -f rttm -i diarization/ -o interviews \
--speaker-map "SPEAKER_00=Interviewer,SPEAKER_01=Guest"El importador crea un ítem por grabación, copia la grabación en interviews/media/ y escribe config.yaml, data/diarization.jsonl y un README. En el proyecto de prueba de 16 grabaciones en que se basa esta página, la línea de resumen decía:
Imported 16 item(s), 1 question(s), 0 answer(s) from 0 annotator(s), and 16 model suggestion(s) on 16 item(s) from RTTM speaker diarization.El importador admite tres opciones propias:
--rttm-scheme audio|tieredelige el esquema en el que caen los turnos. El valor predeterminadoaudiocrea un esquemaaudio_annotationllamadospeakerscuyas etiquetas son los hablantes.tieredcrea un esquematiered_annotationllamadotierscon un nivelspeaker. Usatiereden un estudio que transcribe después turno por turno.--speaker-maprenombra hablantes, y un hablante que el mapa no nombra conserva su nombre RTTM. Usa el mapa solo cuando un nombre signifique la misma persona en todas las grabaciones. Un diarizador numera los hablantes dentro de cada archivo, ySPEAKER_00en una entrevista ySPEAKER_00en la siguiente pueden ser personas distintas.--media-dir DIRnombra la carpeta que contiene las grabaciones cuando no están junto a los archivos RTTM.
El importador lee solo las líneas SPEAKER y cuenta los demás tipos de línea como omitidos. También se omiten los turnos de duración cero, los turnos con un inicio negativo, los turnos sin nombre de hablante (<NA>) y un turno listado dos veces. RTTM separa los campos con espacios, y el importador lee un nombre de hablante que contiene un espacio solo hasta el espacio, con una advertencia. Importar un proyecto cubre la importación completa.
La configuración de diarización
La configuración generada ya muestra los turnos importados como preanotaciones. Añade una clave de administrador y un bloque model_training al final de config.yaml. El archivo completo de abajo pasa python -m potato.validate_cli config.yaml --strict:
port: 8000
annotation_task_name: diarization (imported)
task_dir: .
output_annotation_dir: annotation_output/
data_files:
- data/diarization.jsonl
item_properties:
id_key: id
text_key: text
user_config:
allow_all_users: true
users: []
site_dir: default
pre_annotation:
enabled: true
field: predictions
allow_modification: true
annotation_schemes:
- annotation_type: audio_annotation
name: speakers
description: Check and correct who speaks when.
source_field: audio_url
mode: label
labels:
- name: Guest
- name: Interviewer
admin_api_key: "change-me"
model_training:
enabled: trueEl importador ordena las etiquetas de los hablantes alfabéticamente, y Guest va antes que Interviewer. La escritura de vuelta del modelo va de forma predeterminada al campo de ítem predictions, el mismo campo que lee el bloque pre_annotation de la importación. Potato se niega a arrancar cuando un bloque pre_annotation activado nombra un campo distinto de writeback.field, porque entonces no se vería ninguna preetiqueta del entrenamiento. Deja writeback fuera de la configuración hasta que la primera ejecución tenga una puntuación sobre ítems reservados que merezca mostrarse a los anotadores.
Corregir los turnos de los hablantes
Inicia el servidor desde la carpeta del proyecto:
cd interviews
potato start config.yaml -p 8000Cada grabación se abre con los turnos del diarizador dibujados sobre la forma de onda. Los anotadores mueven los bordes de un turno, cambian el hablante de un turno, eliminan un turno de ruido y dibujan los turnos que el diarizador omitió. Las preanotaciones se guardan solo cuando un anotador guarda el ítem. Un ítem que nadie abrió no tiene respuesta y no entrena. Anotación de diarización de hablantes cubre los controles de la forma de onda y los atajos de teclado.
El entrenador diarization necesita al menos 4 grabaciones anotadas en la partición train, y la partición predeterminada reparte cerca del 70 % de las grabaciones etiquetadas en train. Corrige al menos 8 grabaciones antes de la primera ejecución, y más si quieres una puntuación sobre ítems reservados fiable.
Entrenar el modelo de diarización
Abre http://localhost:8000/admin, introduce la clave de administrador y ve a /admin/training. Elige diarization como entrenador y speakers como esquema. La página Training ofrece también hf-audio-tagger para el mismo esquema. hf-audio-tagger conviene a etiquetas que nombran tipos de sonido y no hablantes. Para entrevistas de dos personas, pon el campo Parameters en:
{"max_speakers": 2}Pulsa Train now. La misma ejecución puede iniciarse desde un script con la clave de administrador:
curl -X POST -H "X-API-Key: change-me" -H "Content-Type: application/json" \
http://localhost:8000/admin/training/api/runs \
-d '{"trainer": "diarization", "schemas": ["speakers"], "params": {"max_speakers": 2}}'diarization sigue la receta del modelo de segmentación de pyannote (Bredin y Laurent, 2021) sin pyannote ni los pesos restringidos de pyannote, y ajusta WavLM (microsoft/wavlm-base-plus) con un clasificador de tramas para hasta max_speakers hablantes. El modelo ve chunk_s segundos de audio a la vez, 10 de forma predeterminada. La pérdida de cada fragmento se calcula con la mejor correspondencia entre las salidas de hablantes del modelo y los hablantes anotados del fragmento. La correspondencia importa porque un nombre de hablante se refiere a personas distintas en grabaciones distintas, y un clasificador sobre nombres no tendría un objetivo coherente. Los parámetros siguientes dan forma a los turnos predichos:
| Parámetro | Valor predeterminado | Efecto |
|---|---|---|
max_speakers | 3 | Máximo de hablantes activos dentro de un fragmento, hasta 6 |
chunk_s | 10 | Segundos que el modelo ve a la vez |
threshold | 0.5 | Probabilidad de trama a partir de la cual un hablante cuenta como hablando |
min_gap_s, min_duration_s | 0.2, 0.2 | Una pausa más corta dentro de un turno se cierra, y un turno más corto se descarta |
model_name | microsoft/wavlm-base-plus | Un punto de control de WavLM o wav2vec 2.0, o una ruta local |
El entrenamiento remoto envía una ejecución a un servidor con GPU por ssh o a un clúster SLURM.
Leer la puntuación de diarización
La página de la ejecución y GET /admin/training/api/status informan de la puntuación de la ejecución sobre las grabaciones reservadas. Para diarization, la métrica principal es diarization_accuracy, definida como 1 menos la tasa de error de diarización (DER) y con un mínimo de 0. La DER suma el habla omitida, la falsa alarma y la confusión de hablantes, y divide la suma entre el habla anotada. Potato mide la DER sobre una cuadrícula de 10 ms sin margen de tolerancia, con la mejor correspondencia uno a uno entre hablantes predichos y anotados. La ejecución informa también por separado de los tres tipos de error. Lee los tres números para ver si el modelo omite habla, inventa habla o confunde hablantes. La DER ignora si un turno se llama Interviewer o SPEAKER_01 y cuenta si el hablante cambia en los momentos correctos.
El nombre de una métrica incluye la partición, como en val_der o test_diarization_accuracy. Una grabación con turnos anotados y sin predicción cuenta como errónea. Por eso un modelo no puede subir la puntuación omitiendo las grabaciones difíciles.
Publicar los turnos predichos
Cuando la puntuación sobre ítems reservados justifique mostrar los turnos del modelo a los anotadores, añade el esquema a writeback y reinicia el servidor:
model_training:
enabled: true
writeback:
schemas: [speakers]
include_unlabeled: trueinclude_unlabeled: true predice también sobre las grabaciones que nadie ha corregido todavía. Sin este ajuste, una ejecución predice solo sobre las grabaciones reservadas de val y test. Entrena de nuevo tras el reinicio. El informe de escritura de vuelta de GET /admin/training/api/status da el recuento. En el proyecto de prueba, el informe decía «Published 7 prediction(s) as prelabels.» para 3 grabaciones de val y 4 grabaciones sin corregir, y las grabaciones de la partición train conservaron los turnos RTTM importados.
El modelo nombra a los hablantes por orden del primer habla dentro de cada grabación, usando primero las etiquetas del esquema y después SPEAKER_00, SPEAKER_01 y así sucesivamente. El primer hablante que se oye en cada grabación es por tanto Guest en este proyecto, sea o no esa persona el invitado. El modelo no tiene incrustaciones de voz con las que reconocer a una persona. Un hablante que calla durante el solapamiento entre dos fragmentos y vuelve a hablar más tarde recibe un nombre nuevo. Pide a los anotadores que comprueben el nombre del hablante de cada turno predicho y no solo los bordes del turno. Modelo en el ciclo cubre la revisión de preetiquetas empezando por las de menor confianza y el reentrenamiento a medida que llegan correcciones.
Exportar los turnos corregidos como RTTM
La exportación segments escribe de nuevo los turnos corregidos como RTTM, un archivo por anotador:
python -m potato.export --config config.yaml --format segments --output ./export/La exportación escribe export/segments.jsonl, una fila por turno, y export/rttm/<annotator>.rttm. El identificador de archivo de cada línea RTTM es el nombre de la grabación sin su extensión. pyannote.metrics, dscore o md-eval pueden entonces puntuar la salida original del diarizador frente al archivo corregido sin cambios. En el proyecto de prueba, las primeras líneas de export/rttm/ana.rttm decían:
SPEAKER meet000 1 0.200 1.055 <NA> <NA> Guest <NA> <NA>
SPEAKER meet000 1 1.539 0.755 <NA> <NA> Interviewer <NA> <NA>Diarización sobre un nivel de hablantes
Importa con --rttm-scheme tiered cuando los anotadores vayan a añadir otros niveles, como un nivel de transcripción, a la misma línea de tiempo:
potato import -f rttm -i diarization/ -o interviews --rttm-scheme tieredLa importación escribe un esquema tiered_annotation llamado tiers con un nivel speaker. Añade admin_api_key y model_training como arriba, con schemas: [tiers] bajo writeback, y la configuración pasa validate_cli --strict. diarization entrena con el nivel de hablantes y escribe los turnos predichos de vuelta en el mismo nivel. El entrenador elige el nivel llamado speaker o speakers. Si no existe, elige el único nivel cuyo nombre contiene «speaker», y un nivel llamado non-speaker no cuenta. La última alternativa es el único nivel con etiquetas. Cuando califican dos niveles, o varios niveles tienen etiquetas y ninguno lleva nombre de hablantes, la ejecución deja fuera las grabaciones con una advertencia que nombra los niveles.
Ajustar Whisper con transcripciones corregidas
whisper-asr ajusta Whisper con los turnos de transcripción que corrigieron los anotadores y sugiere después correcciones en los turnos que nadie ha revisado. La sección parte de una carpeta de grabaciones sin transcripción.
Transcribir las grabaciones
Coloca las grabaciones en la carpeta media/ del proyecto y transcríbelas en la máquina del servidor:
pip install "potato-annotation[transcribe]"
potato transcripts media --transcribe --asr-model small.en --asr-word-timestamps \
--media-url-prefix /media -o data/interviews.jsonpotato transcripts --transcribe ejecuta WhisperX cuando WhisperX está instalado y funciona en la máquina, y faster-whisper en caso contrario. El extra [transcribe] instala faster-whisper, y WhisperX es una instalación aparte (pip install whisperx) que trae su propio PyTorch. Potato recurre a faster-whisper cuando WhisperX falta, no se importa, no puede ejecutarse en el dispositivo o no puede cargar el modelo, y el resumen nombra el motor de cada archivo. --asr-engine whisperx o --asr-engine faster-whisper ejecuta un solo motor sin alternativa. --media-url-prefix /media escribe la ruta de cada grabación como /media/<file>, la dirección desde la que la página de anotación reproduce la grabación.
--asr-word-timestamps marca el tiempo de cada palabra por alineación forzada y permite que WhisperX divida un segmento al final de una oración. En las grabaciones de prueba, WhisperX devolvió un turno por grabación de 10 segundos sin la opción y tres turnos por grabación con ella. Los turnos más cortos dan más ejemplos a whisper-asr, y la ventana de entrada de Whisper es de 30 segundos. Formatos de transcripción y Cómo anotar transcripciones de Whisper cubren las opciones de transcripción, las etiquetas de hablante y la salida de Whisper ya existente.
La configuración de transcripción
Un esquema speech_transcript muestra cada turno de la transcripción con su intervalo de tiempo y un cuadro de corrección. La configuración completa de abajo pasa validate_cli --strict:
annotation_task_name: "Interview transcript correction"
task_dir: .
output_annotation_dir: annotation_output/
data_files:
- data/interviews.json
item_properties:
id_key: id
text_key: conversation
admin_api_key: "change-me"
annotation_schemes:
- annotation_type: speech_transcript
name: transcript
description: "Play each turn and type the right text wherever the transcript is wrong."
segments_key: conversation
error_types: [asr_error]
model_training:
enabled: true
trainer_params:
whisper-asr:
model_name: openai/whisper-small
language: ensegments_key: conversation nombra el campo bajo el que potato transcripts escribe la transcripción. error_types: [asr_error] deja una sola marca de error, porque el estudio cubre solo errores de transcripción. language: en fija el idioma para el entrenamiento y la predicción. Sin definir, un Whisper multilingüe detecta el idioma una vez a partir de hasta 16 turnos de entrenamiento, y el registro de la ejecución advierte cuando coinciden menos de tres de cada cuatro de los turnos muestreados.
Turnos corregidos como ejemplos de entrenamiento
Cada turno corregido es un ejemplo, formado por el audio del turno recortado de la grabación según el inicio y el final del turno, junto con el texto corregido. Un turno que nadie corrigió no es un ejemplo, porque el esquema guarda solo los turnos que un anotador tocó, y un turno sin tocar puede estar bien o puede no haberse leído. Un turno marcado sin corrección tampoco es un ejemplo. Los turnos de más de 30 segundos se dejan fuera con una advertencia. El entrenador se niega a ejecutarse con menos de 10 turnos corregidos en la partición train.
Corrige todos los turnos erróneos de las grabaciones que abras, porque la puntuación sobre ítems reservados se calcula sobre los turnos corregidos. En las 12 grabaciones de prueba, WhisperX con tiny.en falló en 11 de 36 turnos, con errores como «Epsilanti» por Ypsilanti, «Cary Town» por Kerrytown y un «I» omitido al comienzo de un turno.
Entrenar y comparar con la transcripción
Elige whisper-asr y el esquema transcript en la página Training y pulsa Train now. La puntuación principal es word_accuracy, que es 1 menos la tasa de error de palabras (WER) sobre los turnos corregidos. La ejecución informa también de wer_asr, la WER de la transcripción original sobre los mismos turnos, y un turno que el modelo dejó intacto se puntúa como el texto de la transcripción. Compara los dos números antes de publicar nada. Un modelo ajustado merece mostrarse a los anotadores solo cuando su WER es inferior a wer_asr.
La ejecución de prueba en que se basa esta página muestra por qué importa la comparación. Con 8 turnos corregidos en train, min_instances rebajado a 4 y openai/whisper-tiny entrenado durante 3 épocas, la ejecución obtuvo una WER de 0,31 sobre test frente a 0,19 de la transcripción original. Un modelo a ese nivel sustituiría texto correcto por texto erróneo. Reúne más correcciones, o parte de un punto de control mayor, y entrena de nuevo antes de añadir writeback.
Publicar correcciones sugeridas
Cuando el modelo supere a la transcripción, añade el esquema a writeback, reinicia y entrena de nuevo:
model_training:
enabled: true
trainer_params:
whisper-asr:
model_name: openai/whisper-small
language: en
writeback:
schemas: [transcript]
include_unlabeled: trueLa predicción transcribe todos los turnos de todas las grabaciones reservadas y sin etiquetar. Un turno cuyo texto nuevo difiere de la transcripción se convierte en una corrección sugerida, marcada asr_error, con la probabilidad media de tokens del modelo como confianza de la sugerencia. Las sugerencias rellenan los cuadros de corrección, y un anotador conserva, edita o borra cada sugerencia.
Transcribir grabaciones nuevas con el modelo ajustado
De forma predeterminada la ejecución escribe también ct2/, una copia CTranslate2 en int8 del modelo, entre los artefactos de la ejecución. La copia necesita el paquete ctranslate2, que el extra [transcribe] instala con faster-whisper. Pasa la ruta de la copia a potato transcripts para transcribir el siguiente lote de grabaciones con el modelo ajustado:
potato transcripts media/batch2 --transcribe \
--asr-model annotation_output/training/runs/<run_id>/artifacts/ct2 \
--media-url-prefix /media/batch2 -o data/batch2.jsonWhisperX y faster-whisper cargan la copia. La página de la ejecución muestra el identificador de cada ejecución, y Configuración describe las carpetas de las ejecuciones.
Detectar llamadas en espectrogramas
Un esquema spectrogram_annotation hace que los anotadores dibujen cajas de tiempo y frecuencia alrededor de las llamadas. torchvision-detect y ultralytics-detect entrenan con esas cajas renderizando cada grabación como una imagen de espectrograma tal como el widget dibuja el espectrograma. El renderizado pone la frecuencia en un eje lineal desde min_freq hasta max_freq del esquema, o la mitad de la frecuencia de muestreo cuando max_freq no está definido, con 256 píxeles de alto y 100 píxeles por segundo. Cada caja se convierte en una caja de imagen. El tiempo y la frecuencia se asignan linealmente a píxeles. El IoU de una caja sobre la imagen es por tanto igual a su IoU en segundos por hercios. Una caja sin rango de frecuencia, como la que dan una etiqueta de Audacity o una fila de BirdNET, cubre toda la banda. Una grabación de 41 segundos o más se renderiza con al menos 4096 píxeles de ancho y se corta en ventanas que se vuelven a unir.
Las cajas suelen venir de una importación. potato import lee tablas de selección de Raven, pistas de etiquetas de Audacity y la salida de BirdNET-Analyzer en un proyecto spectrogram_annotation, como describen Bioacústica en Potato y Verificar detecciones de BirdNET en un espectrograma. Los entrenadores aprenden de las cajas que dibujaron o corrigieron los anotadores, y los detectores leen los píxeles del espectrograma y no las incrustaciones de BirdNET ni de Perch.
La configuración de abajo pasa validate_cli --strict y fija el score_threshold del detector en 0,5:
annotation_task_name: "Dawn chorus calls"
task_dir: .
output_annotation_dir: annotation_output/
data_files:
- data/recordings.jsonl
item_properties:
id_key: id
text_key: id
admin_api_key: "change-me"
annotation_schemes:
- annotation_type: spectrogram_annotation
name: calls
description: "Draw a box around each call and pick its type."
source_field: audio_url
max_freq: 8000
labels:
- name: whistle
- name: chirp
model_training:
enabled: true
trainer_params:
torchvision-detect:
score_threshold: 0.5
writeback:
schemas: [calls]
include_unlabeled: trueEl espectro de una grabación de 16 kHz termina en 8 kHz, y max_freq: 8000 muestra toda la banda. El score_threshold predeterminado de 0,25 conserva más conjeturas del detector. En el proyecto de prueba de 24 grabaciones, torchvision-detect con el umbral predeterminado predijo 34 cajas para 10 llamadas anotadas en las grabaciones de test, y cada caja de más es una caja más que un anotador debe eliminar.
Cada fila de datos nombra su grabación, como en {"id": "site_00", "audio_url": "/media/site_00.wav"}. Un detector entrena solo con grabaciones que tienen al menos una caja, porque una grabación sin cajas se ve igual que una grabación que nadie revisó. Los detectores necesitan 20 grabaciones anotadas en la partición train de forma predeterminada (min_instances).
torchvision-detect ajusta un Faster R-CNN a partir de los pesos COCO de torchvision, y ultralytics-detect entrena un detector YOLO. El detector YOLO es más rápido de entrenar y de ejecutar. Ultralytics tiene licencia AGPL-3.0, y un modelo entrenado y distribuido con Ultralytics está sujeto a los términos de la AGPL. La página Training pide confirmar la licencia antes de una ejecución de ultralytics-detect, y una ejecución por API necesita "accept_licence": true. Ambos detectores se puntúan con el mAP con IoU 0,5 sobre el espectrograma renderizado, y ambos escriben de vuelta cajas predichas en start_s, end_s, low_hz y high_hz, marcadas como salida del modelo, para rellenar previamente el widget. Modelos de visión cubre los parámetros de los detectores y el teselado.
Etiquetar eventos sonoros con hf-audio-tagger
hf-audio-tagger aprende los segmentos de tiempo etiquetados de un esquema audio_annotation, como voz, música, llamadas o toses. El entrenador ajusta un codificador de voz, facebook/wav2vec2-base de forma predeterminada, para indicar qué etiquetas están activas en cada trama de unos 20 ms. Cada etiqueta se puntúa por separado. Los segmentos solapados con etiquetas distintas se aprenden por tanto tal como se anotaron. Los segmentos predichos vuelven como regiones editables sobre la forma de onda. La configuración de abajo pasa validate_cli --strict:
annotation_task_name: "Dawn chorus events"
task_dir: .
output_annotation_dir: annotation_output/
data_files:
- data/recordings.jsonl
item_properties:
id_key: id
text_key: id
admin_api_key: "change-me"
annotation_schemes:
- annotation_type: audio_annotation
name: events
description: "Mark every call on the waveform and pick its type."
source_field: audio_url
mode: label
labels:
- name: whistle
- name: chirp
model_training:
enabled: true
writeback:
schemas: [events]
include_unlabeled: trueEl etiquetador trata todo tramo de una grabación que ningún anotador marcó como «aquí no hay etiqueta». La suposición conviene a un estudio en que los anotadores marcan todos los eventos, y la descripción del esquema de arriba pide «every call». Cuando los anotadores marcan solo algunos eventos, el modelo aprende a pasar por alto el resto. La puntuación principal es el F1 de segmentos, en el que un segmento predicho coincide con un segmento anotado de la misma etiqueta con un IoU de al menos 0,5, y la ejecución informa también del IoU medio de los segmentos coincidentes. El entrenador necesita 10 grabaciones anotadas en la partición train de forma predeterminada.
| Parámetro | Valor predeterminado | Efecto |
|---|---|---|
window_s | 10 | Segundos de audio por ventana de entrenamiento y de predicción |
threshold | 0.5 | Probabilidad de trama a partir de la cual una etiqueta está activa |
min_gap_s, min_duration_s | 0.1, 0.1 | Una pausa más corta dentro de un segmento se cierra, y un segmento más corto se descarta |
freeze_feature_encoder | true | Mantiene fijas las capas convolucionales de características del codificador |
La página Training ofrece tanto hf-audio-tagger como diarization para un esquema audio_annotation. Elige hf-audio-tagger cuando una etiqueta nombre un tipo de sonido y signifique lo mismo en todas las grabaciones. Elige diarization cuando las etiquetas sean hablantes cuyos nombres son locales a cada grabación.
Las ejecuciones en que se basa esta página
Los comandos y las configuraciones de esta página se ejecutaron con Potato 2.14.0 en un portátil, con los modelos más pequeños que se nombran abajo. El camino de la diarización se ejecutó de principio a fin, desde una importación RTTM de 16 grabaciones sintéticas de dos hablantes con el 20 % de los turnos asignados al hablante equivocado, pasando por correcciones en 12 grabaciones, una ejecución de diarization y la escritura de vuelta, hasta la exportación segments. La ejecución usó un codificador de prueba de una capa en lugar de WavLM. La puntuación de la ejecución no dice por tanto nada sobre voz real. La sección de Whisper usó 12 grabaciones de voz sintetizada, transcritas con WhisperX y tiny.en y ajustadas a partir de openai/whisper-tiny. Las secciones de espectrogramas y del etiquetador usaron 24 grabaciones sintéticas de tonos a 3 kHz y 6 kHz. Todos los bloques de configuración pasan python -m potato.validate_cli --strict.
Más información
- La descripción general del entrenamiento de modelos explica el ciclo de entrenamiento, la página Training y las puntuaciones sobre ítems reservados.
- Entrenadores lista todos los entrenadores con sus esquemas, instalación y parámetros.
- Configuración documenta todas las claves de
model_training, la escritura de vuelta y las rutas. - Modelo en el ciclo cubre la revisión de preetiquetas y el reentrenamiento automático.
- Anotación de audio prepara tareas de clasificación, eventos, transcripción y diarización.
- Formatos de transcripción lista todos los formatos de transcripción que lee Potato.
- La referencia del repositorio original documenta, parámetro por parámetro,
diarization,whisper-asr,hf-audio-taggery espectrogramas.
Referencias
- Bain, M., Huh, J., Han, T., and Zisserman, A. (2023). WhisperX: Time-Accurate Speech Transcription of Long-Form Audio. Interspeech 2023, 4489–4493. doi:10.21437/Interspeech.2023-78
- Bredin, H., and Laurent, A. (2021). End-To-End Speaker Segmentation for Overlap-Aware Resegmentation. Interspeech 2021, 3111–3115. doi:10.21437/Interspeech.2021-560
- Chen, S., Wang, C., Chen, Z., Wu, Y., Liu, S., Chen, Z., Li, J., Kanda, N., Yoshioka, T., Xiao, X., Wu, J., Zhou, L., Ren, S., Qian, Y., Qian, Y., Wu, J., Zeng, M., Yu, X., and Wei, F. (2022). WavLM: Large-Scale Self-Supervised Pre-Training for Full Stack Speech Processing. IEEE Journal of Selected Topics in Signal Processing. doi:10.1109/JSTSP.2022.3188113
- Radford, A., Kim, J. W., Xu, T., Brockman, G., McLeavey, C., and Sutskever, I. (2023). Robust Speech Recognition via Large-Scale Weak Supervision. Proceedings of the 40th International Conference on Machine Learning, PMLR 202, 28492–28518. proceedings.mlr.press