

# Preparar datos de transcripciones de TikTok para un análisis de contenido

Sí, podés reunir subtítulos públicos de TikTok para un análisis de contenido cuantitativo después de validarlos. El análisis de contenido cuantitativo significa que contás una regla de contenido clara en un conjunto de videos que definiste. Una pista de subtítulos es texto público que ya está unido a un video. En este artículo, una transcripción es ese texto del subtítulo. No es una copia nueva de cada palabra hablada. Validar significa que vos comparás el subtítulo con el video. El texto devuelto contiene datos de subtítulos. No es un registro completo del habla, de las imágenes ni de cada publicación de TikTok.

Una pregunta pública de investigación consulta cómo reunir transcripciones de TikTok para un estudio. También consulta cómo controlar la exactitud y cómo analizar el texto en R. R es un programa para tablas y conteos. La pregunta muestra una necesidad. No prueba que este método sea válido. No muestra cuántos estudios lo necesitan. Consultá la [pregunta pública sobre transcripciones de TikTok](https://www.reddit.com/r/CompSocial/comments/1h1zijh/help_needed_scraping_tiktok_video_transcripts_for/).

Reunís filas con un Actor. Un Actor es un programa de recolección de datos alojado. Alojado significa que se ejecuta como un servicio, no como un archivo en tu computadora. Este Actor es el [TikTok Transcript Scraper](https://apify.com/chronometrica/tiktok-transcript-scraper). Una Task es un ajuste de entrada guardado. Un ajuste predefinido es un conjunto guardado de opciones de entrada. La Task actual es [TikTok Transcript Dataset for Content Analysis](https://apify.com/chronometrica/tiktok-transcript-scraper/examples/tiktok-transcript-content-analysis-dataset). El Actor reúne filas de origen. Vos hacés la codificación y los conteos. Una Task pública es solo una entrada de partida. No significa que el análisis se ejecute solo.

## Qué devuelve el recolector actual

Estos hechos públicos se revisaron el 2026-10-13. La compilación actual es 0.1.36. Cada ejecución acepta de 1 a 100 destinos públicos conocidos en `startUrls`. Un destino puede ser una URL de video, un enlace corto o un ID numérico de video. El Actor no busca un perfil, una palabra clave ni una página de sonido. Ya tenés que conocer los videos.

`preferredLanguages` es una lista ordenada de idiomas de subtítulos públicos. El Actor elige la primera pista pública que coincide. Una lista vacía usa la primera pista pública. No traduce el texto. No crea texto a partir de un sonido que no tiene subtítulos. No reúne comentarios. No asigna códigos de contenido.

La entrada guardada de la Task es:

```json
{"startUrls": ["https://www.tiktok.com/@hankgreen1/video/7047596209028074758"], "preferredLanguages": []}
```

Qué devuelve el recolector actual

Reemplazá esa muestra por tus propios videos públicos conocidos. Para una prueba piloto de un video, poné una URL en `startUrls`. Si el inglés es el idioma de tu estudio, configurá `preferredLanguages` en `["en"]`. Si tu estudio usa otro idioma, escribí esa regla de idioma y usá su código. No copies `["en"]` en un estudio de otro idioma. Una lista vacía puede devolver otra pista pública.

Una fila del conjunto de datos representa cada entrada enviada. Una entrada fallida igual recibe una fila. Conservá esa fila. Es evidencia del intento. Estos campos son exactos: `inputIndex`, `inputUrl`, `videoId`, `videoUrl`, `authorHandle`, `durationSeconds`, `languageCode`, `text`, `segments`, `status`, `statusReason`, `isBillable` y `scrapedAt`. Cada segmento tiene `startSeconds`, `endSeconds` y `text`. Los tiempos de TikTok usan esas dos claves. Usá `startSeconds` y `endSeconds` tal como se devuelven. Conservá cada `videoId` como texto, no como número. Un ID largo puede cambiar si un programa lo guarda como número.

`status` puede ser `succeeded`, `no_public_captions`, `language_unavailable`, `duplicate_input`, `not_tiktok`, `invalid_input`, `unsupported_url`, `video_unavailable`, `not_public` o `blocked_or_challenged`. También pueden ocurrir fallos de extracción y fallos de subtítulos. El éxito exige texto que no esté vacío. Una transcripción nula o vacía con un estado de fallo no demuestra que no haya habla. El video todavía puede tener habla. Solo sabés que no volvió ningún subtítulo utilizable.

`isBillable` es verdadero solo para un resultado exitoso de transcripción nativa. El nombre del campo usa una b minúscula. Las otras filas quedan en los datos como evidencia. `isBillable` no describe toda la ejecución. Una ejecución puede mezclar filas verdaderas y falsas. No digas que toda la ejecución es gratuita.

La cuenta de la ejecución usa estos nombres exactos: `inputsReceived`, `resultRows`, `billableTranscriptRows`, `nonBillableResultRows`, `duplicateVideosSkipped` y `statusCounts`. Esta cuenta controla la ejecución. No muestra que tus videos representen a todos los creadores.

Un control de un video el 2026-10-13 usó la muestra guardada. La fila tuvo éxito. El ID del video fue el ID solicitado, `7047596209028074758`. El código de idioma fue `eng-US`. Un código como `eng-US` es una etiqueta regional de subtítulos. Significa inglés con una etiqueta de región de Estados Unidos. No es una traducción. El texto no estaba vacío. La fila tenía 12 segmentos. El tiempo de los segmentos tenía la forma `startSeconds` y `endSeconds`. Acá no se repite ninguna palabra de los subtítulos de ese video. Ese control prueba una ruta de subtítulos públicos en esa única fuente. No prueba que las palabras sean perfectas. No prueba que todos los videos tengan éxito. No prueba que tu código de contenido sea válido. Tu propia prueba piloto sigue siendo necesaria.

## Ocho acciones

1. Definí la pregunta, el código y la muestra

Escribí una pregunta de investigación. Escribí un código de contenido que puedas contar. Un código de contenido es el rasgo que marcás como presente o ausente. Elegí URL de videos conocidos bajo una regla que puedas enunciar. Enunciá el período, el idioma y el alcance de creadores antes de reunir los datos.

Un registro de muestreo es la lista de cada video que seleccionaste. Completá ese registro antes de mirar los subtítulos. No selecciones videos solo porque existe un subtítulo. Si conservás solo los videos con subtítulos, cambiaste la muestra. Los videos sin subtítulo quedarían afuera en lugar de figurar como faltantes.

1. Declará la unidad de conteo

Elegí la unidad que vas a contar. La unidad puede ser un video, un segmento de subtítulo o un pasaje que definas. En estos pasos, la unidad contada es el video. Un segmento es un fragmento temporizado del texto del subtítulo. Los segmentos son evidencia del video. No son videos extra.

Tres segmentos con el mismo código igual cuentan como un video. Anotá esa regla antes de la ejecución. Conservá la URL de entrada, el `videoId` devuelto y tu propio `selected_video_key`. La clave del estudio es tuya. Sigue igual aunque cambie la forma de la URL.

1. Probá un video seleccionado

Ejecutá un video seleccionado antes de cualquier lote. Esto es una prueba piloto. Una prueba piloto es una prueba pequeña de toda la ruta. Inspeccioná `status`, `videoId`, `languageCode` y `text`. Para que el resultado sea exitoso, el texto no debe estar vacío. Si el idioma de tu estudio es inglés, configurá `preferredLanguages` en `["en"]` en esta prueba piloto.

Después [compará un pasaje corto con el audio](/es/articles/auditor%C3%ADa-de-palabras-de-subt%C3%ADtulos-de-tiktok/). También mirá la imagen en pantalla. Anotá las palabras omitidas, las palabras de más y las palabras incorrectas. Una fila exitosa no prueba que las palabras sean exactas. El control de 12 segmentos de arriba solo muestra que la ruta pública puede devolver un subtítulo. No es tu validación.

1. Ejecutá la lista acotada y conciliala

Enviá solo tus URL conocidas, hasta 100 en una ejecución. Una lista seleccionada más larga necesita otra ejecución. Emparejá cada entrada enviada con una fila de resultado. Usá `inputIndex`, `inputUrl` y `videoId`. Emparejá esas filas con la cuenta de la ejecución.

Controlá `inputsReceived`, `resultRows`, `billableTranscriptRows`, `nonBillableResultRows`, `duplicateVideosSkipped` y `statusCounts`. Conservá los duplicados en las notas y contá ese video una sola vez. Conservá los subtítulos faltantes en el registro, pero fuera del conjunto de éxito. Hacé lo mismo con los fallos de acceso a la fuente. Esos estados incluyen `video_unavailable`, `not_public`, `blocked_or_challenged`, `unsupported_url`, `not_tiktok` e `invalid_input`.

Nunca codifiques un texto fallido vacío como "código ausente". Un texto vacío significa que no observaste el código. No significa que el código esté ausente.

1. Armá una tabla de videos y una tabla de segmentos

Armá una fila por cada video seleccionado. Usá estas columnas: `selected_video_key`, `videoId`, `videoUrl`, `languageCode`, `caption_status`, `caption_validated`, `study_eligible` y `exclusion_reason`. `study_eligible` registra si el video puede entrar en el conteo. No es el código de contenido. `caption_validated` registra si revisaste el subtítulo contra el video.

Usá `unknown` cuando no pudiste revisar el subtítulo. No escribas `caption_validated` como no cuando el estado verdadero es desconocido. Una fila fallida no fue validada. Una revisión sin terminar tampoco fue validada.

Conservá los segmentos en una segunda tabla. Usá la clave del video, `startSeconds`, `endSeconds`, `text` y una observación de la fuente. Un arreglo de segmentos dentro de una celda de hoja de cálculo es una exportación deficiente. CSV es una tabla de texto plana. Una lista anidada no entra en esa forma plana de un modo seguro. Exportá primero JSON. JSON es un formato de texto que puede conservar una lista dentro de un elemento. Después aplaná a propósito. Aplanar significa que armás una fila simple por segmento. Repetí la clave del video en cada fila de segmento. No partas el texto por las comas. Las oraciones contienen comas. Dejá sin cambios el texto crudo del subtítulo. Poné cada código en columnas nuevas.

1. Escribí una regla de codificación pequeña y probala con ficción

Los ejemplos desde este paso son ficción. No son salida del Actor. No pegues estos ID en una entrada real. Sus URL de video son desconocidas.

Escribí una regla corta y dale una versión. Para una regla simple de palabra exacta, definí la palabra, el uso de mayúsculas y minúsculas, y el límite de palabra. Un límite de palabra impide que una palabra corta coincida dentro de una palabra más larga. Revisá vos mismo los usos ambiguos. Una regla de palabra clave solo encuentra ese patrón. No prueba qué quiso decir quien habla. Un mensaje transmitido solo mediante imágenes puede no coincidir con las palabras. El sarcasmo también puede no coincidir con las palabras. Esos casos necesitan que una persona los codifique.

El código ficticio de acá es una instrucción explícita de medir el agua. La versión de regla v1 marca el código 1 cuando el texto validado del subtítulo da esa instrucción. La palabra completa "measure" cuenta en cualquier uso de mayúsculas y minúsculas. La palabra "measurement" es otra palabra. Revisala. No la marques solo con la regla de palabra clave. El código 0 solo se permite en un subtítulo validado que no tiene la instrucción. Si no, el código queda desconocido.

1. Revisá un conjunto piloto y después importalo en R

Codificá un conjunto piloto pequeño antes de un estudio grande. Dos personas pueden codificarlo por separado. O podés codificarlo de nuevo más tarde y comparar. Guardá `code`, `code_version`, `coder`, `decision_note` y una marca de tiempo. La marca de tiempo registra cuándo se tomó la decisión. Conservá el texto crudo en su propia columna.

R puede leer un CSV plano. Indicale a R que las columnas de ID son texto. No dejes que R adivine un ID numérico. El fragmento de abajo usa solo R base. Usa las filas ficticias. No agrega un paquete. No es un estándar de investigación probado. Acá, `denom` es el denominador. El denominador es por cuántos videos elegibles dividís. `NA` significa no disponible. Este ejemplo usa `NA` para un código desconocido.

```r
videos <- data.frame(
  videoId = c("video-v1", "video-v2", "video-v3", "video-v4", "video-v5"),
  study_eligible = c("yes", "yes", "no", "no", "no"),
  code = c(1, 0, NA, NA, NA),
  stringsAsFactors = FALSE
)
stopifnot(is.character(videos[["videoId"]]))
eligible <- videos[["study_eligible"]] == "yes"
stopifnot(!any(is.na(videos[["code"]][eligible])))
code_count <- sum(videos[["code"]][eligible])
denom <- sum(eligible)
share <- code_count / denom
```

Ocho acciones

`code_count` es 1. `denom` es 2. `share` es 0.5. Los valores `NA` son códigos desconocidos. No son ceros. La línea `stopifnot` detiene el script si un video elegible tiene un código desconocido.

Cuando exportes un CSV real, conservá el mismo control de texto:

```r
videos_from_csv <- read.csv(
  "video_table.csv",
  stringsAsFactors = FALSE,
  colClasses = c(videoId = "character")
)
stopifnot(is.character(videos_from_csv[["videoId"]]))
```

Ocho acciones

También podés probar la regla ficticia de palabras en R base:

```r
raw_text <- "I measure the water before I pour it"
hit <- grepl("\\bmeasure\\b", raw_text, ignore.case = TRUE)
ambiguous <- grepl("\\bmeasure\\b", "measurement", ignore.case = TRUE)
```

Ocho acciones

`hit` es TRUE. `ambiguous` es FALSE. El segundo resultado explica por qué una palabra más larga necesita una regla de revisión humana, no una coincidencia silenciosa.

1. Informá el conteo con el registro completo de resultados

Usá solo los videos elegibles como denominador de la proporción del código. Elegible significa `succeeded`, texto no vacío y `caption_validated` en yes. Informá cada resultado de video seleccionado junto a esa proporción. Quienes leen tienen que ver los fallos y las filas sin terminar. Limitá el hallazgo a los videos que seleccionaste y observaste. No lo enuncies como un resultado para todos los creadores. No lo enuncies como un resultado para todo el discurso político.

Los subtítulos faltantes pueden cambiar una conclusión. Este artículo se detiene en el registro. No enseña [cuánto pueden mover un resultado esas filas faltantes](/es/articles/subtitulos-faltantes-tiktok-muestra/).

## Conteo ficticio de cinco videos

La misma ficción sigue acá. V1 a V5 son etiquetas de estudio inventadas. Los valores de `videoId` son etiquetas de texto inventadas. No son ID reales de TikTok. `videoUrl` es desconocida en cada fila. No envíes estas etiquetas al Actor. Un `languageCode` real puede ser un valor regional como `eng-US`. Esta ficción usa `en` porque el idioma declarado del estudio es inglés. En las tablas, unknown es el valor del estudio. En el ejemplo de R, `NA` guarda ese mismo desconocido. No guardes unknown como 0.

El código declarado sigue siendo la instrucción explícita de medir el agua.

V1 está en inglés. Tuvo éxito. El subtítulo fue validado. El texto es "I measure the water before I pour it". Ese texto es una instrucción explícita de medir el agua. El código es 1.

V2 está en inglés. Tuvo éxito. El subtítulo fue validado. El texto es "I pour water into the tray". Le indica a alguien que vierta. No le indica a alguien que mida. El código es 0.

V3 tiene el estado `no_public_captions`. El texto está vacío. `languageCode` es desconocido. No inventes uno. `caption_validated` es unknown, no no. El código es desconocido. Un texto vacío no es el código 0. Tampoco es prueba de silencio.

V4 tiene el estado `language_unavailable`. El texto está vacío. `languageCode` es desconocido. `caption_validated` es unknown. El código es desconocido. Este fallo no es el mismo fallo que V3. Mantené separados los dos motivos.

V5 está en inglés. Tuvo éxito. Una persona comparó el subtítulo con el audio. Al subtítulo le faltó la frase de medición. La validación no está terminada. `caption_validated` es unknown, no no. `study_eligible` es no. El código queda desconocido. El éxito no es lo mismo que un subtítulo de confianza. No conviertas esta fila en el código 0.

Un video entra en la proporción solo cuando `study_eligible` es yes. Esa decisión es independiente del código. V1 y V2 son elegibles porque el subtítulo tuvo éxito, el texto no está vacío y una persona lo validó. V3 y V4 no son elegibles porque la recolección falló. V5 no es elegible porque la validación no está terminada. `isBillable` sería verdadero para V1, V2 y V5, porque esos resultados de transcripción tuvieron éxito. `isBillable` sería falso para V3 y V4. V5 es facturable y aun así no es elegible. La marca de facturación no decide el conteo del estudio.

Tabla de videos:

| selected_video_key | videoId | videoUrl | languageCode | caption_status | caption_validated | study_eligible | exclusion_reason |
| --- | --- | --- | --- | --- | --- | --- | --- |
| V1 | video-v1 | unknown | en | succeeded | yes | yes | none |
| V2 | video-v2 | unknown | en | succeeded | yes | yes | none |
| V3 | video-v3 | unknown | unknown | no_public_captions | unknown | no | sin subtítulos públicos; texto vacío no codificado |
| V4 | video-v4 | unknown | unknown | language_unavailable | unknown | no | falta el idioma solicitado; texto vacío no codificado |
| V5 | video-v5 | unknown | en | succeeded | unknown | no | revisión del audio sin terminar; faltó la frase de medición |

Tabla de códigos:

| selected_video_key | code | code_version | coder | decision_note | timestamp |
| --- | --- | --- | --- | --- | --- |
| V1 | 1 | v1 | coder-a | instrucción explícita de medir el agua | example-only |
| V2 | 0 | v1 | coder-a | solo instrucción de verter; instrucción de medir ausente | example-only |
| V3 | unknown | v1 | coder-a | subtítulo fallido; código no observado | example-only |
| V4 | unknown | v1 | coder-a | subtítulo fallido; código no observado | example-only |
| V5 | unknown | v1 | coder-a | subtítulo no validado; código no observado | example-only |

Tabla de segmentos:

| selected_video_key | startSeconds | endSeconds | text | source_observation |
| --- | --- | --- | --- | --- |
| V1 | 0.5 | 2.5 | I measure the water before I pour it | evidencia de subtítulo validado para el código 1 |
| V1 | unknown | unknown | unknown | segundo segmento de medición; solo evidencia extra; tiempos no definidos aquí |
| V2 | unknown | unknown | I pour water into the tray | evidencia de subtítulo validado para el código 0 |
| V5 | unknown | unknown | unknown | el subtítulo omitió una frase hablada de medición; las palabras no se definen aquí |

V3 y V4 no tienen filas de segmentos. El texto de su resultado está vacío. No agregues un segmento en 0 segundos. El cero parecería un tiempo real. El tiempo faltante queda desconocido.

El primer segmento de V1 termina a los 2.5 segundos y empieza a los 0.5 segundos. 2.5 menos 0.5 es 2.0 segundos. Esa duración usa `endSeconds` y `startSeconds`. El segundo segmento de V1 también respalda el código de medición. No crea un segundo video. V1 sigue siendo un video codificado. La unidad contada es el video.

Videos elegibles validados: 2. Videos con código 1: 1. 1 / 2 = 0.5, que es 50 por ciento. El registro seleccionado igual tiene 5 videos. 1 / 5 = 0.2, que es 20 por ciento. No informes 20 por ciento. V3, V4 y V5 no se verificaron como código 0. Lo desconocido no es cero.

Conteos de resultados para los cinco videos seleccionados: 2 validados y elegibles, 2 fallidos y 1 con validación sin terminar. Los dos fallos tienen estados distintos. Uno es `no_public_captions`. El otro es `language_unavailable`.

Suponé que enviaste estas cinco entradas una vez. Suponé que no hubo duplicados. La cuenta esperada de abajo es aritmética de esta ficción. No es un comprobante real. `inputsReceived` sería 5. `resultRows` sería 5. `billableTranscriptRows` sería 3. `nonBillableResultRows` sería 2. `duplicateVideosSkipped` sería 0. `statusCounts` mostraría `succeeded` 3, `no_public_captions` 1 y `language_unavailable` 1. Tu ejecución real tiene que controlarse contra la cuenta que realmente recibís.

Este ejemplo muestra que los segmentos extra no suman videos. También muestra el denominador elegible. No muestra un conjunto real de videos. No muestra una tasa de exactitud de los subtítulos. No muestra un efecto más allá de estas filas inventadas.

Una forma JSON plana para el segmento conocido de V1 es:

```json
{
  "videoId": "video-v1",
  "segments": [
    {
      "startSeconds": 0.5,
      "endSeconds": 2.5,
      "text": "I measure the water before I pour it"
    }
  ]
}
```

Conteo ficticio de cinco videos

Ese objeto es ficción para el paso de aplanar. Después de aplanar, la tabla de segmentos de arriba es la copia de codificación. La tabla de videos sigue siendo la copia de conteo.

## Siguiente acción

Validá un video público seleccionado antes de reunir la lista completa. Controlá la entrada, la fila de estado y el registro de codificación. Usá el Actor [TikTok Transcript Scraper](https://apify.com/chronometrica/tiktok-transcript-scraper) y la Task [TikTok Transcript Dataset for Content Analysis](https://apify.com/chronometrica/tiktok-transcript-scraper/examples/tiktok-transcript-content-analysis-dataset). Reemplazá el video de muestra por una URL pública conocida tuya.

## Fuentes y lecturas adicionales

- [TikTok Transcript Scraper](https://apify.com/chronometrica/tiktok-transcript-scraper)
- [TikTok Transcript Dataset for Content Analysis](https://apify.com/chronometrica/tiktok-transcript-scraper/examples/tiktok-transcript-content-analysis-dataset)
- [Pregunta pública sobre transcripciones de videos de TikTok](https://www.reddit.com/r/CompSocial/comments/1h1zijh/help_needed_scraping_tiktok_video_transcripts_for/)