rany2

Activity

Stars and mentions · Last 30 days, Oct 5 – Nov 3

GitHub stars173
Mentions14
0481216Oct 5Oct 19Nov 3
UTC days · repositories rany2 owns1 repository

Top repositories

rany2’s repositories ranked by new stars, as on trending.

Loading

Contributes to

Repositories outside rany2’s account where rany2 opened or reviewed pull requests in the past 365 days.

Who noticed rany2

Everyone who starred or forked rany2’s repositories since the archive began in 2011.

Notable accounts

Ordered by the stars their own repositories have received.

Biggest fans

Accounts that starred the most of these repositories.

Breakout weeks

Each repository’s best week of new stars, with the release published around it.

Mentions

12posts
Nov 40 posts
  1. Hacker News · · saikatsg · rany2/edge-tts

    edge-tts: Edge's online text-to-speech service from Python

    1 point
  2. 来源:edge-tts 仓库 rany2/edge-tts | 微软 v1→v2 迁移讨论 edge-tts#490

    9 views
  3. Kokoro is 82M params and Apache-2.0; I used the af_heart voice. hexgrad/kokoro rany2/edge-tts What free TTS do you use that doesn't sound robotic?

    4 views
  4. YouTube · · YouTube description · Back To Code · rany2/edge-tts

    I Turned a Web Page Into a Video: HyperFrames Tutorial, HTML In, MP4 Out (GSAP, three.js, FFmpeg) This chart race wasn't made in a video editor. It's one HTML file, rendered to MP4 by HyperFrames, an open-source tool that's trending on GitHub this month. In this tutorial I build "GitHub Trending Wrapped" from scratch: I scrape GitHub Trending into JSON (no API key), build the video as a web page with a kinetic title, a star race, repo cards and a three.js starfield, preview it live in the HyperFrames studio, render it to MP4, and then use one --batch command to turn the top trending repos into six vertical Shorts. No AI model anywhere: just Node, headless Chrome and FFmpeg. HyperFrames has optional AI features (TTS, transcription, cloud rendering); I don't use any of them. What I measured (one shared machine: 8 CPU cores, no GPU / software WebGL, HyperFrames 0.8.185, 2 workers, load average 1–5 during the renders): • Main video: 780 frames (26 s of 1080p) rendered in 29.9 s wall clock, about 26 frames per second captured; 19.7 MB MP4 • 6 Shorts (6 s each, 1080x1920) from one --batch command in 35.7 s, about 6 s per Short, about 1.2 MB each • Rendering the main video twice, and rendering Short #6 on its own, gave byte-identical files (same SHA-256) • Whole project: 336 lines (211 in index.html, 82 in the Short template, 43 in the two Node scripts) One measurement on one machine, not a benchmark. GitHub numbers were checked on 22 Oct 2026 (09:05 PKT): heygen-com/hyperframes had 69,328 stars, +17,177 this month, #4 on the monthly trending list for all languages. Trending changes daily. Chapters 0:00 Hook: this video is a web page 0:10 The plan 0:20 What HyperFrames is 1:26 Setup: init, pin, vendor 2:08 Data: scrape GitHub Trending 3:04 The composition contract 4:05 Scene 1: kinetic title 4:56 Scene 2: the star race 6:07 Scenes 3 and 4: cards and outro 6:41 three.js starfield (seekable WebGL) 7:28 Render to MP4 8:26 A vertical Short template 9:16 One command, six Shorts 9:56 Measured numbers 10:57 A few honest notes 11:49 References and thanks A few honest notes • The race has only two real data points per repo (today and 30 days ago), so the motion between them is a straight line. • Scraping github.com/trending is not an official API and can break any day. • three.js r149 is used because it's the last plain-script build; newer versions need an import map. The linter gave 4 warnings because it prefers one sub-composition per scene; I kept one file on purpose. • GSAP is free to use, including commercially, under its "standard no-charge" license, but that license is not open source. • Longer code blocks were pasted and only key lines typed; input was scripted. The narration is a synthetic text-to-speech voice (Microsoft Edge TTS, en-US AndrewNeural). References and licences • HyperFrames (Apache-2.0): heygen-com/hyperframes • GSAP standard license: gsap.com • three.js (MIT): threejs.org • FFmpeg: ffmpeg.org • Data: github.com/trending (public page, scraped once per run) • Narration: edge-tts (rany2/edge-tts) • Fonts: Anton and Inter (SIL Open Font License) Thanks to the HyperFrames team at HeyGen for open-sourcing this. If you want more builds with trending open-source tools, subscribe to Back To Code. #hyperframes #gsap #threejs #ffmpeg #javascript #html #githubtrending

    1 like · 82 views
  5. I Automated a TikTok Campaign for My App by Editing CapCut's Project Files Directly I shipped Judge Me, a small Android app where people read "Am I the jerk?"-style dilemmas and vote: you were right, you were wrong, both of you messed up, or it's complicated. The app works. Nobody knows it exists. So I'm running a 14-day experiment: short vertical videos on TikTok and Instagram Reels, one per day, each telling one dilemma from the app and ending with "go vote." The goal is simple and measurable: 500+ Play Store installs in 14 days, or one video over 50k views. If neither happens, I stop and try something else. !Image description This post is about the boring-but-interesting part: how I made producing a video take ~5 minutes of my time instead of an hour, with no paid tools. The constraints - Solo dev with a full-time day job. Video editing time is near zero. - No budget for AI video SaaS subscriptions. - English content aimed at a US audience, posted from Turkey (so everything gets scheduled for 03:00 my time). - Every video has the same structure, which is the key insight: if the structure is fixed, the editing is a data problem. Each video looks like this: | Time | What's on screen | |---|---| | 0–2 s | Big hook text (first sentence of the story) | | 2 s → end−4 s | Background clip + AI voiceover + 2–3 word captions | | Last 4 s | "Right or wrong? YOU decide." + screenshot of the app's vote screen | Step 1: Script → voice + word timestamps Scripts are 100–130 words, first person, short sentences, ending with "So… was I wrong?". I use edge-tts, which is free and — crucially — streams word boundary events with timestamps alongside the audio. comm = edge_tts.Communicate(text, "en-US-GuyNeural", rate="+12%", boundary="WordBoundary") async for chunk in comm.stream(): if chunk["type"] == "audio": f.write(chunk["data"]) elif chunk["type"] == "WordBoundary": start = chunk["offset"] // 10_000 # 100ns ticks → ms words.append({"text": chunk["text"], "start_ms": start, "end_ms": start + chunk["duration"] // 10_000}) That gives me an MP3 plus a JSON list of every word and when it's spoken. Captions come for free. Gotcha: word boundaries have no punctuation My first captions looked like star She launched and reviews So I — chunks bleeding across sentences. The boundary events return bare words, so my "break on punctuation" rule never fired. Fix: re-align the timed words against the original script tokens (which do have punctuation), then chunk in two passes — split on clause boundaries first, then divide each clause into balanced groups so you never get a lonely one-word chunk: def chunk_words(words, max_words=3, max_chars=20): clauses, cur = [], [] for w in words: cur.append(w) if w["text"][-1:] in ".!?,;:…": clauses.append(cur); cur = [] if cur: clauses.append(cur) chunks = [] for cl in clauses: k = -(-len(cl) // max_words) # ceil while True: # balance sizes, respect char limit size, extra = divmod(len(cl), k) parts, i = [], 0 for j in range(k): step = size + (j < extra) parts.append(cl[i:i+step]); i += step if all(len(" ".join(x["text"] for x in p)) <= max_chars for p in parts) or k >= len(cl): break k += 1 chunks.extend(parts) return chunks Before: They showed up | late. After: They showed | up late. Small thing, but captions are most of what people actually read on mute. Step 2: CapCut projects are just JSON This is the part that made the whole pipeline possible. CapCut desktop stores each project as a folder containing draft_content.json — tracks, segments, materials, text styles, all in plain JSON. (Some versions encrypt it; mine, 9.6 on Windows, didn't. Check yours before building on this.) The structure, simplified: tracks[] → video / audio / text tracks, each with segments[] segments[] → material_id + target_timerange {start, duration} in µs + clip transform materials.texts[] → text content (as an embedded JSON string!) + style materials.videos[] → file paths for clips and images materials.audios[] → file paths for audio My approach: 1. Build one template project by hand with placeholder text layers: HOOK_TEXT, SUB_1, VOTE_TEXT, plus the background, audio, and vote-screen image. 2. Let CapCut open and re-save it once, so the file is in its own canonical format. 3. Keep that folder as a read-only master. 4. For each video, a Python script copies the template's JSON and rewrites it: - swap the audio and background paths - set every duration to the MP3 length (in microseconds) - put the first sentence into HOOK_TEXT - clone the SUB_1 layer once per caption chunk, each with a fresh UUID and the chunk's timing - set the vote text and move it to the last 4 seconds The one non-obvious detail: the text content lives in a JSON string inside the JSON, with a character range for styling. Change the text without updating the range and the styling breaks. def set_text(mat, text): c = json.loads(mat["content"]) c["text"] = text for st in c["styles"]: st["range"] = [0, len(text)] mat["content"] = json.dumps(c, ensure_ascii=False) Then I open CapCut, glance at the timeline, and hit Export. That's my whole manual step. Batch mode Once one video worked, I generated 10 separate CapCut projects in one go — copy the template folder, give it a new draft_id, register it in CapCut's root_meta_info.json, render the content. CapCut picked them all up in its project list. Ten videos, ten exports, done in one sitting. Rules I learned the hard way - CapCut must be fully closed when you write. If it's open, it autosaves over your changes. A .locked file in the project folder tells you it's open. - Back up before every write. My script copies the target project to a backup folder first, every time. - Text wrapping isn't guaranteed. My first hook ran off both edges of the screen — CapCut ignored the max line width I set. I now wrap the hook myself into balanced lines of ≤20 characters before writing it. - Pin the CapCut version and turn off auto-update. This is an undocumented format. An update can break everything. What didn't work: letting an AI agent click through CapCut My first attempt was to have an AI agent with desktop control build the template inside CapCut by clicking. It was slower and flakier than I expected: CapCut's media panel didn't respond to synthetic mouse events at all (couldn't drag a text layer onto the timeline), and the agent's own window kept stealing focus. After a few rounds I switched to "just edit the files," which took less time than the clicking attempts had. Lesson: if an app has a readable file format, editing the file beats automating the UI almost every time. Distribution gotcha: no link in bio Plan said "link in bio." TikTok said no — clickable bio links need 1,000 followers on a personal account, and the business account switch wasn't available to me without verification. Plain-text URLs in the bio aren't clickable. So the end card now says "Vote free: search 'Judge Me AITA' on Google Play" — I checked that exact search ranks the app first. The downside: I lose UTM attribution on TikTok and have to infer it from Play Console's search-traffic numbers. Instagram still gets a proper tracked link. The setup, in numbers - Cost: $0 (edge-tts, CapCut free tier, Pexels backgrounds) - My time per video after setup: ~5 minutes (open project, check, export, schedule) - Stock ready before day 1: 10 videos - Posting: one per day at 03:00 Turkey time (evening in the US), scheduled What's next The experiment starts this week. I'll post the results — views, installs, what hooks worked, and whether 03:00 scheduling actually mattered — when the 14 days are up, including if it flops. If you're an indie dev sitting on an app nobody knows about, the takeaway isn't "use CapCut." It's: find the fixed structure in your marketing content, and turn the repetitive part into data. --- Judge Me is on Google Play. I build in public as @fatihbuilds.

  6. Reddit · · r/Cantonese · u/antiphony · rany2/edge-tts

    Anki Flashcards for Cantonese HSK 3.0 I’ve created these flashcards using the new HSK 3.0 2025 syllabus as the basis which began testing in 2026. Included are all levels 1-9 with traditional/simplified characters, jyutping/pinyin, English definition, as well as Cantonese audio. In total there are 11,000 words/phrases and it’s reversible so 22,000 cards. Each level is separated into subdecks. As the basis of this vocabulary list is Mandarin, the translations into Cantonese will be imperfect. Given all the linguistic differences, regional variations, contextual scenarios, etc, it is impossible to select a perfect singular translation for each flashcard. So do not refer to this list as the de facto translations between Mandarin, Cantonese and English - they are merely "best estimates" using translation tools which may contain errors. The main goal here is to provide a single massive study resource for learners organized by level to recognize and recall Chinese characters along with their pronunciations, of which there is no such official standard for Cantonese. Happy studying! ---------------------------------- Process of creation The HSK vocabulary was passed through Google Translate to get the traditional characters and Hong Kong Cantonese phrasing. This did mostly a good job but of course had many errors. I went through and manually fixed over 500 translations using Wiktionary to check them. As the levels go higher especially in the advanced levels 7-9 they become increasingly literary and business-oriented. So I made the decision to lean more casual tone for lower levels and more formal for higher levels, sticking closer to the provided Mandarin vocabulary rather than the auto-translation which I feel tends toward casual. I adjusted a few of the English translations as well for clarity. Credits - Ministry of Education of China of for the HSK vocabulary - hanzistroke.com for the compiled HSK lists and English definitions - Google Translate for translation to traditional characters and Cantonese phrasing - Wiktionary for verification of translations - lucw for the tools to generate jyutping and pinyin - edge-tts for the audio Please support by downloading and liking the Anki deck to keep it alive and shared!

    8 points
  7. FluentVoice Pro 1.6.4: online voices back on Microsoft's original server FluentVoice Pro 1.6.4 is out: the Microsoft online voices are back on their original server. In October 2026 Microsoft's classic voice server started refusing connections (HTTP 403) for every app built on edge-tts (edge-tts #490). FluentVoice 1.6.3 worked around that by switching to Microsoft's newer server. Upstream edge-tts 7.3.0 / 7.3.1 fixed the outage, so 1.6.4 requires edge-tts 7.3.1 and reads from the classic server again. The 1.6.3 failover stays as a safety net. Also new: if Microsoft briefly limits requests after many readings (HTTP 429), Test providers now says so in plain words and suggests waiting a minute or using an offline voice. - GitHub release: github.com/nickotmazgin/fluentvoice-pro/releases/… - Discussion: fluentvoice-pro#72 - Microsoft Store: apps.microsoft.com (1.6.4 is live) - Scoop: scoop update fluentvoicepro Earlier write-up for the 1.6.3 health check and failover: dev.to Some AI assistance was used while preparing this post. !FluentVoice Pro reading aloud on laptops in a library !FluentVoice Pro in use on a laptop during a flight !FluentVoice Pro on a cruise deck in Alaska !FluentVoice Pro in operations and EMS settings (collage)

  8. 如果 edge-tts 突然报 403,先别反复重装。上游 #490 已有多人报告,7.2.8 也受影响。 截至10月12日,修复提案 #491 仍未合并,正式版还没更新。先跟进上游进展: edge-tts#490

    18 views
  9. FluentVoice Pro 1.6.3: the Microsoft online voices work again, plus a health check that says what to fix FluentVoice Pro is my free, open-source text-to-speech tray app for Windows 11 and 10: select or copy text anywhere, press a hotkey, and it reads it aloud with natural Microsoft online voices, offline HD voices (Piper and Kokoro) or the built-in Windows voices. Version 1.6.3 is out, and it's mostly about one thing: the online voices stopped working for a lot of people this year, and now they work again. Here's the 75-second tour of what's new (the real app, real voices; sound on): {% youtube z2wI4P4XTtk %} The Microsoft online voices work again FluentVoice, like many apps, uses edge-tts to reach the same neural voices Microsoft Edge uses for Read Aloud. In 2026 Microsoft's classic endpoint started answering many users with HTTP 403 (edge-tts #490), for every edge-tts based app, and there's no upstream fix yet. FluentVoice already fell back to an offline voice when that happened, so you still heard the text, just not with the voice you picked. 1.6.3 fixes it on our side. When the classic server refuses with a 403, FluentVoice points edge-tts at Microsoft's newer server for the same voices (api.msedgeservices.com) and keeps using it for the rest of the session. A few details: - edge-tts itself isn't modified (it's LGPL, and I want to drop the workaround the day upstream ships a fix). It reads its websocket URL at connect time, so the switch is one assignment behind a lock. - It only reacts to a real 403. Timeouts, DNS errors or "no audio" keep their existing handling, so a flaky Wi-Fi doesn't move you to a different server. - I tested all 80 online voices in 22 languages on the new server: every one answered, with a median of about 1.1 s to first audio. - One lesson from CodeQL: the new server's URL carries a client key, so the log line names the host only and never the full URL. Every language, the right voice Two language-detection fixes: - Chinese, Japanese and Korean text with English names is detected correctly. "欢迎使用 FluentVoice Pro" used to count as English, because one CJK character weighed as much as one Latin letter. Each CJK character now counts like a short word, and a test checks that every language's sample sentence is detected as that language. - Languages FluentVoice has no voices of its own for (Dutch, Polish, Turkish, Swedish, Vietnamese, Finnish, Greek and more) are read by a Multilingual voice instead of an English one, and Settings shows the real name ("Lang: Dutch (Multilingual voice)"). Short snippets keep the current voice, and text the detector isn't sure about still counts as English. !Dutch text read by a Multilingual voice New: a health check that tells you what to fix When a TTS app goes quiet, the user usually can't tell whether it's their internet, a firewall, Microsoft, the audio device or a hotkey that another app grabbed. Settings → About & Developer now has a Components & sources panel: - Test providers runs live checks of the online voices, the offline HD voices, the Windows voices, the tray and hotkeys, the audio output and the last 24 hours of errors in the log. Each problem comes with a plain-language diagnosis, what to do, and the alternatives: "not connected to the internet" is told apart from "a firewall blocks the voice server" and from "Microsoft refuses the connection". - Verify / repair offline voices re-hashes every downloaded Piper / Kokoro file against the SHA-256 pinned in the app, and offers to download damaged ones again, only from the official hosts. - Components lists the version, licence and source of everything FluentVoice is built from. !Health check: Test providers Everything else, at a glance !FluentVoice Pro v1.6.3 collage Still there from earlier releases: 57 offline HD voices in 16 languages that never send text anywhere, an Offline-only privacy mode, a hotkey that reads your selection (and an optional Stop hotkey), voice fallback that returns to online by itself, single-stream playback so voices never overlap, and a release pipeline with attested builds and SHA256SUMS.txt. The full 5-minute tour of the app is here: youtu.be Get it (free) - Microsoft Store: apps.microsoft.com (updates automatically; 1.6.3 arrives after Microsoft's certification) - GitHub release: github.com/nickotmazgin/fluentvoice-pro/releases/… (source ZIP, portable EXE, MSIX, all attested) - Scoop: scoop bucket add nickotmazgin https://github.com/nickotmazgin/scoop-bucket, then scoop install nickotmazgin/fluentvoicepro Source, changelog and screenshots: nickotmazgin/fluentvoice-pro · Release notes and questions: fluentvoice-pro#66 If you build on edge-tts and hit the 403, the failover is about 50 lines in fluentvoice/core.py; feel free to borrow the idea. Feedback and bug reports are welcome in the comments or on GitHub.

  10. MSサーバー側の問題らしくて、ヨーロッパや日本でもedge-tts使えないみたいだけど、次のラッパースクリプトで鳴るようになるのでとりあえず回避できるとのこと。 ⇒ edge-tts#490

    35 views

Achievements

Awards earned by the repositories rany2 owns. Select an award to embed its badge.

No awards yet

Repositories earn awards by reaching the top three in a completed trending day or week.

A repository earns an award for finishing first, second or third in a completed trending day or week, ranked by new stars, new forks or pull request authors. Awards follow a repository through renames and transfers and count toward its current owner. Weeks run Monday to Sunday, UTC.