Douyin 抖音视频转文字 Transcript Scraper - Speech to Text for AI avatar

Douyin 抖音视频转文字 Transcript Scraper - Speech to Text for AI

Pricing

from $1.99 / 1,000 transcripts

Go to Apify Store
Douyin 抖音视频转文字 Transcript Scraper - Speech to Text for AI

Douyin 抖音视频转文字 Transcript Scraper - Speech to Text for AI

Spoken words of any public Douyin video as plain text plus a timed transcript.

Pricing

from $1.99 / 1,000 transcripts

Rating

0.0

(0)

Developer

Lantern Lab

Lantern Lab

Maintained by Community

Actor stats

0

Bookmarked

9

Total users

8

Monthly active users

7 days ago

Last modified

Share

Douyin 抖音视频转文字 Transcript Scraper

Turn any public Douyin (抖音) video into text: the whole spoken transcript as one plain string you can paste straight into a prompt, plus a line-by-line transcript with a start and end second for every line. Mandarin, Cantonese (粤语) and English come back labelled as what they are. Paste video links, v.douyin.com share links or bare IDs; no login, no cookies, no account of your own. $1.99 per 1,000 transcripts plus $0.001 per 10 seconds of speech transcribed - about $4.99 per 1,000 for a typical 25-second talking video, and nothing at all for a video with no speech in it. See Pricing.

Douyin itself captions almost nothing, so this Actor does the listening: an open-source speech model runs inside the Actor container. There is no speech API behind it, no API key to bring, and your audio and text never leave the run.

Input:

{
"videoUrls": [
"https://www.douyin.com/video/7697968856207770723",
"https://v.douyin.com/iJSMnqRm/"
],
"includeSegments": true,
"maxDurationSec": 600
}

Output - one row per video (recordType: "transcript"), plus one free row per input line and a RUN_SUMMARY. Sample from a real run; nickname partially masked:

{
"recordType": "transcript",
"platform": "douyin",
"dataSource": "guest_web",
"videoId": "7697968856207770723",
"awemeId": "7697968856207770723",
"url": "https://www.douyin.com/video/7697968856207770723",
"title": "小姨子,你嘅粤语真系要好好练下 厨房发生嘅小趣事,小姨子嘅粤语对白有啲搞笑。",
"desc": "小姨子,你嘅粤语真系要好好练下 厨房发生嘅小趣事,小姨子嘅粤语对白有啲搞笑。\n#粤语搞笑 #粤语短剧 #姐夫小姨子 #广府粤语 #搞笑日常",
"authorName": "追梦***",
"publishedAt": "2026-10-18T11:30:44+00:00",
"durationSec": 15.1,
"language": "yue",
"transcriptSource": "asr",
"asrModel": "sensevoice-small",
"text": "姐夫死得未吓,屙就快啦,我就快屙死啦,好快啦,你再忍一忍,咁,我依家去叫星家姐。姐得未,我就快啱死啦,你仲唔出嚟,我同姐夫先死,等阵留你自己一个死。开饭啦。",
"wordCount": 65,
"segments": [
{ "start": 0.19, "end": 6.8, "text": "姐夫死得未吓,屙就快啦,我就快屙死啦,好快啦,你再忍一忍,咁,我依家去叫星家姐。" },
{ "start": 7.75, "end": 13.46, "text": "姐得未,我就快啱死啦,你仲唔出嚟,我同姐夫先死,等阵留你自己一个死。" },
{ "start": 14.43, "end": 15.04, "text": "开饭啦。" }
],
"hashtags": ["粤语搞笑", "粤语短剧", "广府粤语", "搞笑日常"],
"likeCount": 338,
"commentCount": 31,
"input": "https://www.douyin.com/video/7697968856207770723",
"videoStatus": "available",
"accessMode": "direct",
"collectionStatus": "complete",
"partial": false,
"partialReason": null,
"elapsedMs": 23781,
"collectedAt": "2026-10-24T10:26:54+00:00"
}

What it does

  • The words, as plain text. text is the whole transcript in one string, punctuated, ready to feed a language model with no post-processing.
  • The timeline. segments gives every line with the second it starts and ends at, so you can quote a moment, cut a clip or line the transcript up with the video.
  • Cantonese stays Cantonese. A 粤语 video comes back as language: "yue" in written Cantonese, not flattened into Mandarin. Mandarin is zh, English en, Japanese ja, Korean ko.
  • Douyin's own caption first. When a video has a caption track, that text is used as it is - it is the platform's own and it costs no audio transfer. Almost no Douyin video has one, which is why the model is here.
  • The video it belongs to: title, description, author's public nickname, publish time, length, hashtags, likes and comment count, so a transcript never arrives without knowing which post it came from.
  • Silence is said out loud. A video with no speech - a music clip, a silent montage - comes back with text: null, partialReason: transcript:no_speech_detected, and no charge. It is never written as an empty transcript.

What it does not do

  • No keyword search: give it video links or IDs. Use the Douyin Search Scraper to find videos first.
  • No comments (Douyin Comments Scraper), no account statistics (Douyin Profile Scraper).
  • No private, age-restricted or login-only video. Public pages only, read signed out.
  • No translation. The transcript is in the language that was spoken.
  • No audio or video file is stored. The sound is decoded in memory, transcribed and dropped.

Input

FieldTypeDefaultWhat it does
videoUrlsarrayrequiredVideo links, /note/ links, v.douyin.com share links, modal_id= links or bare numeric IDs - one per line.
maxItemsinteger1000Stop after this many videos; the rest are reported as not collected.
includeSegmentsbooleantrueInclude the timed line-by-line transcript. Off gives a smaller row and segments: null.
allowAsrbooleantrueTranscribe the audio when Douyin has no caption track. Off means caption-only, and videos without one cost nothing.
languagestringemptyLeave empty and the model names the language itself, which is what you usually want. Set zh, yue, en, ja or ko and that code is reported instead of the model's answer; it does not change how the audio is read.
maxDurationSecinteger600Videos longer than this are skipped, flagged and not charged.
maxAudioMbinteger40Ceiling on one audio download.
maxUpstreamRequestsintegerderivedHard ceiling on requests to Douyin. Left empty it is worked out from your input, so a run is never unbounded.
proxyConfigurationobjectoffOff by default: Douyin answers visitors without a proxy.
residentialFallbackbooleantrueRetry a refused video once through a residential proxy exiting in China.

Output

Every row carries recordType, partial and collectedAt. Three kinds:

  • transcript - one per video asked for. The only charged kind, and only when it carries words.
  • input_status - one free row per input line: found, duplicate, invalid_url or not_collected, so a line that produced nothing still says why.
  • RUN_SUMMARY - the last row: input outcomes, transcript sources, languages, words produced, audio seconds transcribed and the CPU time spent on them, requests against the ceiling in force, why the run stopped, and resumedAfterMigration. Also saved as the RUN_SUMMARY key-value record.

transcriptSource is platform_caption when Douyin's own caption answered and asr when the model ran, and null when neither was tried (an image album, a video over maxDurationSec, allowAsr: false). A row where the model ran and heard no speech keeps asr and the detected language, but its text is null, wordCount is 0 and it is not charged - check wordCount, not transcriptSource, to tell whether you got words. partialReason uses a fixed vocabulary: transcript:no_speech_detected, transcript:longer_than_maxDurationSec, transcript:asr_disabled_and_no_platform_caption, transcript:image_album_has_no_audio, transcript:audio_download_failed, transcript:audio_decode_failed, blocked:*, cap:*, detail:*.

Pricing

Pay per event: $1.99 per 1,000 transcripts, plus $0.001 for each 10 seconds of speech the model transcribes, plus $0.005 for each run. A video Douyin already captioned costs no audio events at all.

EventPriceCharged for
result$0.00199 ($1.99 per 1,000)Each row that carries words.
asr-10s$0.001 per started 10 seconds of speechThe stretches of a video the model actually found a voice in, added up and rounded up per video - silence and music-only passages are not charged. Not charged for a platform caption, and not charged when the model found no words.
run-start$0.005, once per runThe signed-out browser session every run opens before it reads any post.

What that works out to, per 1,000 videos of someone talking from start to finish (a video that is half quiet costs about half the audio part):

Typical videoPrice per 1,000
15 s$3.49
25 s$4.99
60 s$7.99
3 min$19.99
any length, Douyin captioned it$1.99

A row that only reports a failure - an input line with no video ID, a duplicate, a video Douyin would not describe, a video with no speech, one longer than maxDurationSec, one the run never reached - is written free. A run that reads nothing still pays the $0.005 session.

To cap a run, set Maximum cost per run in the run options. When the cap is reached the Actor stores no further rows, stops before the next video, marks what it cut short partial with cap:maxTotalChargeUsd, and records it in RUN_SUMMARY.

Apify may move a long run to another host, which starts the Actor again from the top. You are not charged twice for that: how far collection got - the input lines finished, the rows written and the videos already in the dataset - is saved in the run's own key-value store after every row (RUN_PROGRESS) and read back at start-up, so the videos already written are skipped in silence rather than collected and billed again, and run-start is charged once per run and not once per host. RUN_SUMMARY.resumedAfterMigration says whether it happened; its row and charge totals cover the whole run either way.

Limits worth knowing before you buy

  • Douyin captions almost nothing. Of sixteen videos measured on 2026-10-24, none carried a caption track, so in practice every transcript is the model's. allowAsr: false is therefore a caption-only mode that will usually return no text.
  • A speech model is not a stenographer. Expect names, brand names and dialect words to come back approximated. segments keeps the timeline so you can check any line against the video.
  • A music-only or heavily mixed soundtrack may yield nothing, or a handful of sung words. A row that comes back empty - including one where the model only looped a single short syllable over the music - says no_speech_detected and is free.
  • Image-album (图文) posts have no audio and are reported as such.
  • Length costs money and time. Three minutes of talking is twelve times the speech of fifteen seconds. maxDurationSec (default 600 s) is the brake.
  • No translation, no speaker labels, no on-screen text (OCR).

Resources

  • Runs with 4 GB memory by default; this is the minimum, because the speech model and the visitor-session browser both live in it. More memory gives more CPU and a faster run at about the same cost.
  • A run opens a visitor session first (about 15-25 seconds), then spends roughly 1 second of CPU per 10 seconds of audio on sensevoice-small (measured over 1,050 seconds of audio on 2026-10-24). The next video's download happens while the current one is being transcribed.

Notes

  • Models: SenseVoice-Small (Apache-2.0, FunAudioLLM) via sherpa-onnx and Silero VAD (MIT). Both ship inside the Actor image; nothing is downloaded at run time. There is one model and it is not selectable: a second engine (Whisper small via faster-whisper) was offered until 0.2.9 and removed because it was 9.6x slower on the same audio at no gain on Chinese.
  • Counts (likeCount, commentCount) are a snapshot at collectedAt, as the exact numbers Douyin reports rather than the rounded 9.8万 the page shows. null means Douyin stated no count - never zero.
  • Personal data is kept to the minimum: the author's public display name only. No account IDs, no handle, no bio, no follower counts.