File size: 3,960 Bytes
10287ea 0b8cd94 6c746fd 10287ea 6c746fd 408b9f4 0b8cd94 6c746fd 9aea6b9 6c746fd 4877770 6c746fd 0e7dac0 7f097eb 6c746fd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
import streamlit as st
from streamlit_audio_recorder import st_audio_recorder
from faster_whisper import WhisperModel
from pyannote.audio import Pipeline
import pyannote.core
from collections import defaultdict
# Función para asignar hablantes a segmentos de transcripción
def assign_speakers_to_segments(diarization, transcription_segments):
speaker_segments = []
# Convertir diarización en un diccionario con los tiempos de inicio y fin de cada hablante
diarization_dict = defaultdict(list)
for segment, _, speaker in diarization.itertracks(yield_label=True):
diarization_dict[speaker].append((segment.start, segment.end))
for transcription_segment in transcription_segments:
start, end = transcription_segment.start, transcription_segment.end
speakers_count = defaultdict(float)
# Contar la duración de cada hablante dentro del segmento de transcripción
for speaker, times in diarization_dict.items():
for seg_start, seg_end in times:
# Calcular la intersección del tiempo de hablante con el segmento de transcripción
overlap_start = max(start, seg_start)
overlap_end = min(end, seg_end)
overlap_duration = max(0, overlap_end - overlap_start)
speakers_count[speaker] += overlap_duration
# Elegir el hablante con la mayor duración total en el segmento
if speakers_count:
speaker = max(speakers_count, key=speakers_count.get)
else:
speaker = "Unknown"
# Añadir el texto del segmento de transcripción y el hablante correspondiente
speaker_segments.append((speaker, transcription_segment.text))
return speaker_segments
# Función principal de la aplicación Streamlit
def main():
logo_url = "https://wallnergroup.com/wp-content/uploads/2023/06/logo-wallner-2048x270.png"
st.image(logo_url)
st.markdown("""
<style>
.titulo {
font-size:24px !important;
font-weight: bold;
text-align: center;
margin: auto;
}
.bywall {
font-size:8px !important;
font-weight: bold;
text-align: center;
margin: auto; }
</style>
<div class='titulo'>
Identificación de Participantes y Transcripción de Reuniones.
</div>
<div class='bywall'>
by Wallner Group
""", unsafe_allow_html=True)
audio_data = st_audio_recorder(recording_seconds=300, stt_language="es-ES", key="audio")
if audio_data is not None:
# Guardar el archivo de audio grabado
with open("audio_temp.wav", "wb") as f:
f.write(audio_data.getbuffer())
# Opción para cargar archivo de audio
audio_file = st.file_uploader("Cargar archivo de audio", type=['wav'])
if audio_file is not None:
# Guardar el archivo de audio cargado
with open("audio_temp.wav", "wb") as f:
f.write(audio_file.getbuffer())
# Cargar y ejecutar los modelos
speaker_segments = process_audio("audio_temp.wav")
# Mostrar los resultados
for speaker, text in speaker_segments:
st.write(f"{speaker}: {text}")
# Función para procesar el audio
def process_audio(audio_path):
# Cargar el modelo de diarización
pipeline = Pipeline.from_pretrained(
"pyannote/speaker-diarization-3.1",
use_auth_token=st.secrets["hfapi"]
)
# Cargar el modelo de transcripción
model = WhisperModel("large-v3", device="cpu", compute_type="int8")
# Ejecutar la diarización y la transcripción
diarization = pipeline(audio_path)
segments, info = model.transcribe(audio_path, language="es")
# Asignar hablantes a segmentos de transcripción
return assign_speakers_to_segments(diarization, segments)
if __name__ == "__main__":
main()
|