Audio to Text: Uploaded & Direct Audio Files avatar

Audio to Text: Uploaded & Direct Audio Files

Pricing

from $4.80 / 1,000 audio minutes

Go to Apify Store
Audio to Text: Uploaded & Direct Audio Files

Audio to Text: Uploaded & Direct Audio Files

Convert audio files to text: paste direct MP3, WAV, M4A, OGG or FLAC links or upload recordings, and get each transcript as text plus TXT and Markdown files. Whisper, 90+ languages, $0.006 per audio minute. Failed or silent files are free.

Pricing

from $4.80 / 1,000 audio minutes

Rating

0.0

(0)

Developer

Yukai Lin

Yukai Lin

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Categories

Share

What does Audio to Text: Uploaded & Direct Audio Files do?

Paste links to your audio files or upload recordings, and get each one back as a text transcript with timestamps plus a TXT and a Markdown file, for $0.006 per audio minute (Whisper, 90+ languages). Failed or silent files are free.

It is made for audio files you already have: MP3, WAV, M4A, AAC, OGG, OPUS, FLAC and other formats ffmpeg can read, from a direct download link or uploaded in Apify Console. Video files (MP4, MOV, WEBM...) work too; only their sound is used. Files up to 2 GB, any length.

How to use: convert an audio file to text

  1. Paste direct file links, one per line, into Audio file URLs (urls). Each link must download in a signed-out or private browser window. Or upload recordings from your computer under Or upload audio files (audioFiles).
  2. Optional: set the Language (empty = detected automatically) and Vocabulary hints for names and terms.
  3. Click Start. Each file becomes one row with the transcript (text), its language, the billed minutes and a link to its .txt file (txtUrl; the Markdown file is mdUrl).
  4. Open the files from those links, download the dataset as JSON, CSV or Excel, or call the Actor from the API.

First run: try the prefilled example

The form already holds one short English speech sample in Audio file URLs: click Start without changing anything. It produces one row with the transcript and charged: true, billed one audio minute ($0.006). No podcast feed is prefilled in this version, so nothing else is transcribed. Then replace the sample with your own links or uploads.

Choose a recording with spoken words. A music-only or silent file comes back as a free row with errorType: "no_text" and noSpeech: true.

Output

The default table shows one row per file:

ColumnMeaning
inputThe line you gave (link or uploaded file)
urlThe audio file that was processed
textThe full transcript (empty on a no-speech row)
languageLanguage of the transcript, e.g. en
txtUrlLink to the plain-text transcript file
billedMinutesAudio minutes charged for this row (0 on every free row)
chargedtrue when this row was billed, false on every failure, skipped or no-speech row
errorTypeWhy a row failed, e.g. invalid_input, no_text, not_found, blocked, too_large (absent on success)

The full JSON row also has timed segments, paragraphs, durationSeconds, wordCount and mdUrl; the Transcripts (all columns) view shows more of them. With two or more transcripts in a run, one combined TXT and Markdown file is saved too (SUMMARY.combinedTranscript).

Subtitles are off by default here. Turn on Save SRT and VTT subtitles (saveSubtitles: true) to also get srtUrl and vttUrl for every file, at no extra charge.

Pricing

EventPrice (Free and Bronze plans)When
Audio minute$0.006 (Silver $0.0054, Gold and above $0.0048)Each started minute of a transcribed file
Audio minute with speaker labels$0.015 (Silver $0.0135, Gold and above $0.012)Instead of the regular minute, only with Speaker labels on
AI summary and chapters$0.01 per fileOnly with AI summary and chapters on
Translated subtitles$0.002 per minute and languageOnly with Translated subtitles set, for languages that succeed

A 60-minute recording costs $0.36. Rows with success: false are never charged: a line that is not a link (invalid_input), a missing or refused file, a file with no speech (no_text), files skipped at your limits. Set Apify's Maximum cost per run in Run options or Max total minutes per run (maxTotalMinutes) to cap a run.

Other sources still work

This Actor runs the same transcription engine, prices and rules as Audio Transcription (tidytools/audio-transcriber). Only the form is set up for audio files: the file fields come first, the example is a single speech sample, no podcast feed is prefilled and subtitles are off by default. Nothing else is turned off. Everything the engine accepts is still processed and charged the same way when you add it, in the form under Other sources (optional) or in the JSON input:

  • Google Drive, Dropbox, OneDrive and other share links ("anyone with the link"), presigned storage links and web pages with one audio or video file, pasted in urls.
  • YouTube, TikTok, Instagram Reel, Loom, Wistia, Streamable and v.redd.it video links, pasted in urls.
  • Podcast RSS feeds or Apple Podcasts links (podcastFeeds, or pasted in urls), with episode count, date and title filters.
  • Another Actor's dataset (datasetId) or its rows pasted into datasetItems, with datasetField naming the URL field (dot paths such as media.url work). Only the media link is used; other columns of those rows are not copied to the results.
  • The request-list field audioUrls of earlier integrations.

See the Audio Transcription README for the details of each source, speaker labels, keyword search, meeting notes, schedules and the n8n / Make integration.

How files are downloaded

  • Each file is requested with our own User-Agent (TidyToolsTranscriber), without cookies or logins. With Download User-Agent on Auto (default), a file whose host refuses it is requested once more with a standard desktop browser User-Agent string (a plain header; no CAPTCHA solving, no browser automation). Choose "TidyTools only" to never switch.
  • With Download files from on Auto (default), a file that Apify's network cannot get is tried through our own servers. When a host sends Retry-After, the Actor waits that long.
  • robots.txt is not read for the links you give: each link is fetched as one user-supplied file or page, nothing is crawled. Reddit post and profile pages are never read (Reddit's robots.txt does not allow it); pass the v.redd.it video link instead.
  • A file that is private, missing, expired or refused comes back as a free row that says why (not_found, link_expired, blocked, ...), and retryable: true marks the ones worth trying again later.

Input (copy and paste)

{
"urls": ["https://webcapture-api.yukailin.workers.dev/samples/speech-sample.wav"],
"language": "en"
}

Limitations

  • Each link must be a public file that downloads without signing in; files up to 2 GB. The Actor never uses cookies or logins and never solves CAPTCHAs, so private or refused files come back as free error rows.
  • Only spoken words are transcribed: music-only or silent files are free no_text rows.
  • Uploads (audioFiles) work in Apify Console only; in API calls pass file URLs in urls.
  • Speaker labels are not available for some languages (e.g. Chinese) or for YouTube links; those rows fail as free unsupported rows.
  • Reddit post and profile pages are not read; use the v.redd.it video link.

FAQ

Why is a row no_text? No speech was found (silence or music only). The row is free; check that the recording has spoken words.

A link fails with invalid_input. The line is not a URL. Put one link per line; each bad line is its own free row and the other files still run.

Can I upload files through the API? In API calls, pass file URLs in urls. audioFiles is the upload field of Apify Console.

Where are the subtitle files? Turn on saveSubtitles to get srtUrl and vttUrl; they are off by default in this version.

Optional content pack

Set "contentPack":true for chapter, show notes, X and LinkedIn drafts in contentPack. Add "contentPackSubtitleLanguages":["Spanish"] for one translated SRT/VTT language in contentPack.translatedSubtitles (the existing $0.002/started-minute subtitle event applies on success). Drafts require review before publishing. Off by default; existing output and charges stay the same. A failed pack has contentPackError and no pack charge. Charge starts 2026-11-06 or later: one $0.10 content-pack event per successful pack, in addition to existing audio-minute charges. Until the operator sets CONTENT_PACK_CHARGE_FROM to an announced date on or after 2026-11-06 and that date arrives, the text pack is free.