búsqueda semántica sobre transcripción traducida
Pipeline Multimodular: Búsqueda Semántica Sobre Transcripción Traducida
🇺🇸 English version of this document
Este documento detalla un pipeline multimodular que recibe un archivo de audio como entrada, lo transcribe, traduce la transcripción, y habilita búsqueda semántica sobre la transcripción.
El documento se divide en las siguientes secciones:
Monta tu Pipeline
Para lograr lo antes descrito, monta un pipeline que consiste de los siguientes módulos en secuencia:
-
Un módulo
transcribe(transcripción). -
Un módulo
translate(traducción). -
Un módulo
json-to-txt. -
Un módulo
parser(fragmentación de texto). -
Un módulo
text-embedder(encaje léxico). -
Un módulo
vector-db(base de datos vectorial).
Usas la combinación de módulos json-to-txt y parser, que combina los fragmentos transcritos en un solo documento que luego vuelve a fragmentar, para asegurarte que cualquier quiebre indeseado generado por el ROC no resulte en fragmentos parciales que confundan el modelo de encaje léxico.
Para crear el pipeline usarás el método create_pipeline de la siguiente manera:
# creación del pipeline descrito
pipeline = krixik.create_pipeline(
name="multi_busqueda_semantica_sobre_transcripcion_traducida",
module_chain=["transcribe", "translate", "json-to-txt", "parser", "text-embedder", "vector-db"],
)
Procesa un Archivo de Entrada
Examina el archivo de prueba antes de continuar:
# examina el archivo de entrada
import IPython
IPython.display.Audio(data_dir + "input/peso_muerto.mp3")
Dado que el audio de entrada está en español, usarás uno de los modelos no-predeterminados del módulo translate (traducción) para traducirlo a inglés: opus-mt-es-en.
Sí usarás los modelos predeterminados para el resto de los módulos de este pipeline, así que no hace falta especificarlos en el argumento modules del método process.
# procesa el archivo a través del pipeline según lo arriba descrito
process_output = pipeline.process(
local_file_path=data_dir + "input/peso_muerto.mp3", # la ruta de archivo inicial en la que yace el archivo de entrada
local_save_directory=data_dir + "output", # el directorio local en el que se guardará el archivo de salida
expire_time=60 * 30, # data de este proceso se eliminará del sistema Krixik en 30 minutos
wait_for_process=True, # espera que el proceso termine antes de devolver control del IDE al usuario
verbose=False, # no mostrar actualizaciones de proceso al ejecutar el código
modules={"translate": {"model": "opus-mt-es-en"}}, # especificar un modelo no-predeterminado para el módulo de traducción
)
Reproduce la salida de este proceso con el siguiente código. Para aprender más sobre cada componente de la salida, estudia la documentación del método process.
Dado que la salida de este modelo/módulo es un archivo de base de datos FAISS, process_output se muestra como "null". Sin embargo, el archivo de salida se ha guardado en la ubicación indicada bajo process_output_files. El file_id del archivo procesado es el prefijo del nombre del archivo de salida en esta ubicación.
# nítidamente reproduce la salida de este proceso
print(json.dumps(process_output, indent=2))
{
"status_code": 200,
"pipeline": "multi_semantically_searchable_translated_transcription",
"request_id": "80906843-ff56-49a0-9e1f-e6175837d80b",
"file_id": "afafa5e7-33e7-4584-8b1e-9477f0f4c8ab",
"message": "SUCCESS - output fetched for file_id afafa5e7-33e7-4584-8b1e-9477f0f4c8ab.Output saved to location(s) listed in process_output_files.",
"warnings": [],
"process_output": null,
"process_output_files": [
"../../../data/output/afafa5e7-33e7-4584-8b1e-9477f0f4c8ab.faiss"
]
}
Busqueda Semantica
El método semantic_search de Krixik habilita búsqueda semántica sobre documentos procesados a través de ciertos pipelines. Dado que el método semantic_search hace embedding (encaje léxico) con la consulta y luego lleva a cabo la búsqueda, solo se puede usar con pipelines que de manera consecutiva contienen los módulos text-embedder (encaje léxico) y vector-db (base de datos vectorial).
Ya que tu pipeline satisface esta condición tiene acceso al método semantic_search. Úsalo de la siguiente manera para consultar el texto con lengua natural:
# haz búsqueda semántica sobre el la transcripción generada en el pipeline
semantic_output = pipeline.semantic_search(query="be sure to hold the weights very firmly", file_ids=[process_output["file_id"]])
# nítidamente reproduce la salida de esta búsqueda
print(json.dumps(semantic_output, indent=2))
{
"status_code": 200,
"request_id": "b63645fd-d5f0-4f4e-ab96-8ff017365341",
"message": "Successfully queried 1 user file.",
"warnings": [],
"items": [
{
"file_id": "afafa5e7-33e7-4584-8b1e-9477f0f4c8ab",
"file_metadata": {
"file_name": "krixik_generated_file_name_xdbqgopkac.mp3",
"symbolic_directory_path": "/etc",
"file_tags": [],
"num_vectors": 4,
"created_at": "2024-06-05 14:55:05",
"last_updated": "2024-06-05 14:55:05"
},
"search_results": [
{
"snippet": "To make movement, we have to put the columns in the legs, we are going to start to look at the cauderas and the men together.",
"line_numbers": [
1
],
"distance": 0.327
},
{
"snippet": "To begin, we want to see the feet in the anchors of the caudera and the men, the columns in the ground, a neutral column, mediated by the abdomen, the men are going to go through there.",
"line_numbers": [
1
],
"distance": 0.381
},
{
"snippet": "The men are lightly in front of the bar or in the top, the men are symmetric and sufficient to not be in the ground.",
"line_numbers": [
1
],
"distance": 0.381
},
{
"snippet": "We can have a look at the front.",
"line_numbers": [
1
],
"distance": 0.445
}
]
}
]
}