Reddit Text Cleaner - TTS Ready Narration Scripts
Pricing
from $0.19 / 1,000 text cleaneds
Reddit Text Cleaner - TTS Ready Narration Scripts
Clean up Reddit posts for text-to-speech. It strips markdown, links and edit stamps, spells out AITA-style shorthand and can tone down swearing. Each row holds the narration text, one segment per sentence, word count, read time and a hook score. No AI key needed. $0.20 per 1,000 texts.
Pricing
from $0.19 / 1,000 text cleaneds
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Paste a Reddit post, or pipe a whole batch of them in, and get back text a voice can read straight off: markdown gone, link syntax gone, the "Edit: thanks for the gold" trailer gone, and the result split into one segment per sentence.
It runs on fixed rules, not a model, so there is no key to supply and nothing to pay a model provider. That also means it is literal: it does what its lists say and nothing cleverer, and the places where that bites are written out below rather than left for you to find.
| Input | One block of text, or an array of texts or post objects |
| Output | One row per text: the cleaned narration, its sentences, word and character counts, read time and a hook score |
| Ceiling | No fixed limit, one row per text you send |
| Account needed | None |
| Price | $0.20 per 1,000 texts, flat on every plan. The free plan's $5 a month covers about 25,000 |
🔍 What Reddit Text Cleaner does
Four passes over each text. It strips markdown and link syntax down to plain words. It expands Reddit shorthand so a voice does not spell it out letter by letter: AITA becomes "Am I the asshole" and MIL becomes "mother-in-law". It handles swearing the way you ask, from leaving it alone to removing it. Then it splits the result into sentences.
Each row also carries the numbers you need to decide whether a story fits a clip: word count, character count, sentence count, an estimated read time at your chosen speed, and a hook score out of 100 worked out from the opening sentence.
The texts array takes post objects as well as plain strings. On each object it uses the first of
scriptText, narration, selftext, body or text it finds, so rows from both Reddit scrapers
linked below drop in without reshaping.
📋 What data you get from each cleaned text
| What you get | Field |
|---|---|
| The narration text, ready for a voice | cleaned |
| The same text, one sentence per entry | ttsSegments |
| What you sent, kept for reference | original |
| Counts taken on the cleaned text | wordCount, charCount, sentenceCount |
| A read-aloud estimate at your speed | readTimeSeconds |
| How strong the opening sentence is, 0 to 100 | hookScore |
▶️ How to clean up a Reddit post for a voiceover
- Open Reddit Text Cleaner and click Try for free.
- Paste one post into Text, or put your batch into Texts (batch).
- Pick a Profanity handling mode.
softswaps the commonest swear words for milder ones. - Click Start.
- Take
cleanedorttsSegmentsfrom the dataset, or read them from the API.
💰 How much does it cost to clean up Reddit posts?
$0.20 per 1,000 texts, which is $0.0002 each. Flat on every Apify plan, no volume tiers. On the free plan, the $5 Apify gives you each month covers about 25,000 texts.
One text in, one row out, one charge. There is no model behind this and no key to add, so there is no separate bill on top.
📥 What you give it
{"texts": ["AITA for leaving? **So** here's the _story_. Check [this](https://x.com).","TIFU by replying all. Edit: yes I know."],"profanityMode": "soft","wpm": 150}
| Field | Default | What it is |
|---|---|---|
text | none | A single block of text. Fine for one post. The form opens with a sample post in it. |
texts | none | An array. Strings, or post objects carrying any of the fields named above. |
expandAbbreviations | true | Spells out Reddit and internet shorthand. Read the limits before leaving it on. |
profanityMode | keep | keep, soft for milder swaps, censor for f***, or remove. |
wpm | 150 | Narration speed used to estimate read time. |
Give it one or the other. A run with both text and texts empty fails rather than finishing
with an empty dataset.
📤 What you get back
A real row from a real run:
{"ok": true,"original": "AITA for leaving? **So** here's the _story_. Check [this](https://x.com).\n\nEdit: thanks for the awards! TL;DR: I left.","cleaned": "Am I the asshole for leaving? So here's the story. Check this.","ttsSegments": ["Am I the asshole for leaving?","So here's the story.","Check this."],"sentenceCount": 3,"wordCount": 12,"charCount": 62,"readTimeSeconds": 4.8,"hookScore": 64}
| Field | How to read it |
|---|---|
cleaned | The narration text. This is the thing you feed to a voice. |
ttsSegments | The same text as an array of sentences, for per-line timing or captions. |
original | What you sent, kept for reference and cut off at 4,000 characters. cleaned is never cut. |
wordCount, charCount, sentenceCount | Measured on the cleaned text. |
readTimeSeconds | Word count against your wpm. Set wpm to 0 and this comes back null. |
hookScore | 0 to 100, scored on the first sentence. Useful for sorting a batch before you pick. |
🧾 Reading the output
Every row is a cleaned text and every row is billed. ok is always true, there are no sample rows
and no diagnostic rows, and nothing is filtered out silently.
Two things do get dropped, and it is worth knowing which:
| What you sent | What happens |
|---|---|
An object in texts with none of the known text fields on it | Skipped, no row written |
| Nothing at all, in either field | The run fails instead of writing an empty dataset |
If the row count does not match what you sent, the first line is why.
💡 What people use it for
- Prepping Reddit stories for a faceless video pipeline, where markdown read aloud ruins the take.
- Taking the commonest swearing out of narration in bulk with
soft, instead of editing by hand. - Sorting a pile of candidate stories by
hookScoreandreadTimeSecondsbefore picking the three worth shooting. - Turning long posts into per-sentence segments so captions line up with the audio.
From a subreddit to a voice-over, in three steps:
- Run Reddit Scraper on the subreddits you want,
with
requireStoryon. - Put its rows into this actor's
textsas they are, withprofanityModeset tosoft. - Send the
cleanedvalues to AI Text-to-Speech Voiceover astexts, with your own OpenAI key.
🚧 What it does not do
- It does not remove emoji. Invisible zero-width characters go, visible emoji stay exactly where they were. Strip them yourself if your voice reads them out.
- Abbreviation expansion is blunt. It matches shorthand without caring about case, so "5 mil"
comes out as "5 mother-in-law" and a name like Sil becomes "sister-in-law". If your text has
ordinary words that look like Reddit shorthand, turn
expandAbbreviationsoff. softonly knows four words. It swaps the f-word, "shit", "asshole" and "bitch" for milder ones and leaves every other swear word as written, so read the result before calling it ad-safe.censorandremovematch the start of a word. "Cocktail", "cockpit" and "Dickens" get starred out or deleted along with the swearing.- An
Edit:,Update:,TL;DR:,ETA:orPS:label cuts the rest. Everything from the first one that starts a sentence to the end of the text is removed, and a dash after the label counts too. That is right for a thank-you trailer and wrong when the story keeps going after it. - Sentence splitting is mechanical. An abbreviation with a full stop in it, like "Mr.", starts a new segment.
- English only, and one fixed word list. No language detection, and you cannot supply your own expansions or swaps.
- It does not fetch anything. Give it text. To pull the posts in the first place, use the scrapers linked below.
🧭 Which Reddit actor do you need?
| If you want | Use |
|---|---|
| Posts and their full text from subreddits or profiles you name | Reddit Scraper |
| Posts matching a keyword, across Reddit or inside one subreddit | Reddit Search Scraper |
| Reddit videos as one MP4 with the sound in it | Reddit Video Scraper |
| Post text you already have, cleaned up for a voice to read | This one |
| A post rewritten into a hook and a short-form script | Story to Script Rewriter |
| A finished faceless short video from a subreddit or a story | AI Faceless Video Generator |
| The cleaned text read out loud, as an audio file | AI Text-to-Speech Voiceover |
❓ Questions people ask
Does this call an AI model?
No. It is rules and word lists, which is why there is no key field and why the output is the same every time you send the same text.
Can I feed it the Reddit Scraper's output directly?
Yes. Put the rows into texts as they are. Reddit Scraper rows are read from scriptText, so the
title comes through with the body.
Why is my read time wrong?
It is word count against wpm, nothing more. Set wpm to the speed your voice actually reads at.
A wpm of 0 gives you null rather than a number.
Is original the whole post?
Only up to 4,000 characters. The cleaned field keeps the lot, so use that if length matters.
What does hookScore measure?
How strong the first sentence looks as an opener, scored 0 to 100. It is a sorting aid for a batch, not a verdict.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made code
for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/reddit-text-cleaner. Either way the
run happens on your Apify account at the same price.
🆘 If something breaks
Open the Issues tab on the actor page. Paste the text that came out wrong along with the run ID, and that is usually enough to see it.
