DEV Community

张洲诚(Zack.ZHANG)
张洲诚(Zack.ZHANG)

Posted on

I Ran My Whole Audio Workflow From the Terminal for a Week

My audio workflow used to look like this: draft a script in ChatGPT, paste it into a TTS website, download the MP3, upload a meeting recording to a transcription tool, copy the transcript into a translator, download again. Five tabs, three accounts, the same file uploaded three times.

Gemini Notebook (the renamed NotebookLM, now 50+ languages) removes all of that — but it also removes the knobs. You can't pick the voice, can't shape the tone, can't chain the output into the next step. ElevenLabs synthesizes beautifully, Otter.ai transcribes live meetings, Descript edits podcasts — each excellent, each a silo.

So I spent a week doing the same tasks through one CLI instead. Here's what I ran and what came back.

GitHub logo modelstudioai / cli

Official Model Studio CLI(阿里云百炼 CLI)built for AI Agent frameworks, exposing models, search, multimodal, and workflow capabilities as structured tool calls.

Aliyun Model Studio CLI

The official command-line interface for Aliyun Model Studio (DashScope) AI Platform

npm version Node.js TypeScript License

Aliyun Model Studio CLI Site · 中文文档 · API Documentation · Get API Key


Chat with Qwen, generate images & videos, understand images, call agents, manage memory, search the web — all from your terminal.

Built for AI Agents. Every command works as a structured tool call.

Features

Equip your AI Agent out-of-the-box with these capabilities, composable across complex tasks:

  • Text chat — Qwen3.7-max: major gains in agentic coding, frontend coding, and vibe coding
  • Multimodal (Omni) — Full omni-modal support across text + image + audio + video
  • Image generation & editing — Qwen-Image 2.0: pro text rendering, photorealism, strong semantic adherence, multi-image composition
  • Video generation & editing — happyhorse-1.1 series: text-/image-/reference-to-video and natural-language video editing (up to 9-image reference)
  • Speech synthesis & recognition — CosyVoice streaming TTS, voice cloning from 5–20s samples; FunAudio-ASR covers 30 languages including 7…

Setup (2 minutes, actually)

Bailian CLI is Alibaba Cloud's Model Studio CLI. Its bl speech subcommand covers TTS (CosyVoice model), ASR (Paraformer model), and speech translation.

npm install -g bailian-cli
bl auth login
Enter fullscreen mode Exit fullscreen mode

Grab a free API key from the console — the free tier covered everything below. Verify with bl --version.

Day 1: Can It Do Comedy?

I started with the hardest TTS test I could think of — delivery, not just pronunciation:

bl speech tts --text "Let me tell you about the daily life of a programmer. Stand-up meetings, Jira tickets, and the eternal question: who broke the build this time?" --voice humorous --format mp3
Enter fullscreen mode Exit fullscreen mode

First I ran it with a neutral voice, and the punchline landed like a weather report. With --voice humorous, the output had an actual beat before "who broke the build this time?" and a tonal lift on the question. I also noticed the em dash in my text produced a longer pause than a comma — punctuation is a timing control, which I did not expect.

Not open-mic-ready. Completely fine for a podcast cold open.

Day 2: Audiobook Voice, Ad Voice, Kid Voice

Same command, different --voice, wildly different output.

Gentle, for prose:

bl speech tts --text "It was an autumn evening. The setting sun painted the sky in shades of amber." --voice gentle --format mp3
Enter fullscreen mode Exit fullscreen mode

Slow, warm, measured. One gotcha: I first fed it a long run-on sentence and the voice rushed through without breathing. Splitting into shorter sentences brought the pauses back. Speechify and Audible's AI narration do this well in a web UI; the CLI version becomes interesting when you loop it over 50 chapter files.

Energetic, for ad copy:

bl speech tts --text "Black Friday Mega Sale! Everything 50% off — limited time only!" --voice energetic --format mp3
Enter fullscreen mode Exit fullscreen mode

"50% off" came out as a natural "fifty percent off," not digit-by-digit. My first draft had no exclamation marks and sounded flat even in this style — write the copy the way you want it shouted. Brand-critical campaign? Book a studio. A/B-testing ten versions of promo copy? This is a for-loop.

Childlike, for a story:

bl speech tts --text "Once upon a time, in a big forest, there lived a little rabbit. Every morning, it would look up at the sun and say: Good morning, Mr. Sun!" --voice childlike --format mp3
Enter fullscreen mode Exit fullscreen mode

I tried gentle first — came out as a bedtime narrator, not a character. childlike brightened it into a proper storybook rabbit. Won't fool anyone into hearing a real kid, but for a prototype where each character is just a different flag in a script, it works. Production audiobooks still want the actor.

Day 3: Podcast Intro and a Quote Clip

bl speech tts --text "Hey everyone, welcome to Tech Discovery. I'm your host, and today we're diving into how AI is changing everyday life." --voice podcast-host --format mp3
Enter fullscreen mode Exit fullscreen mode

Greeting energy up front, conversational settle by sentence two. Keeping the script under ~40 words kept the pacing tight; my longer clause-heavy draft dragged in the middle. This is the Gemini Notebook scenario with the opposite trade: it gives you a polished episode with zero decisions, this gives you building blocks with all the decisions.

Quote clip for social:

bl speech tts --text "The real innovation isn't in the model — it's in how we orchestrate it." --voice authoritative --format mp3
Enter fullscreen mode Exit fullscreen mode

Works under ~20 words. I tried a 40-word excerpt and the gravitas turned into a lecture. The voice amplifies a strong line; it can't rescue a weak one.

Day 4: The Meeting Recording

An hour-long call, four people, and somebody has to write the minutes.

bl speech asr --input meeting.mp3 --speaker-diarization --output transcript.md
Enter fullscreen mode Exit fullscreen mode

What came back, structurally:

[Speaker 1] Priority this week is closing out the export feature; staging updates this afternoon.
[Speaker 2] I'll take the docs — first draft by Thursday.
Enter fullscreen mode Exit fullscreen mode

Two things I had to learn the hard way. Without --speaker-diarization, the transcript is one undifferentiated wall of text — the flag gets you Speaker 1 / Speaker 2 labels, and suddenly who-owns-what reads right off the file. And the punctuation restoration surprised me: the ums and filler got broken into readable sentences, so the output is markdown you can actually read. The minutes themselves are step two — I hand transcript.md to a chat model and ask for the summary, decisions, and action items with owners; since the input is already clean and speaker-labeled, that's a one-liner in the same script. Crosstalk segments come back rough, so I skim important minutes against the recording. Otter.ai still owns the live-during-the-meeting case — this only processes recordings after the fact. But the output is a file, and files pipe.

Day 5: Chapters for Show Notes

bl speech asr --input lecture.mp3 --output chapters.md
Enter fullscreen mode Exit fullscreen mode

What came back is a timestamped chapter structure — ## 00:21:45 From tools to workflows — accurate to the sentence, so finding a topic no longer means scrubbing the progress bar. Two manual touches before shipping: the occasional boundary lands mid-thought where two topics blend, so I nudged a couple of cut points, and the auto titles read like plain summaries — I rewrote them with hooks for the show notes. Clean topic transitions produce clean boundaries; a meandering speaker produces a draft you'll adjust. Still beats scrubbing an hour of audio by hand.

Day 6: Translation, and My One Real Mistake

Chinese voice memo → English audio for a collaborator:

bl speech translate --input voice-memo.wav --source zh --target en --output translated.mp3
Enter fullscreen mode Exit fullscreen mode

Two artifacts out: translated text + synthesized English audio. Names, dates, requests all survived. Idioms went literal — anything legal or public-facing still needs a human pass.

The mistake came with a bilingual interview. I ran:

bl speech translate --input interview.mp3 --source zh --target en --output transcript_en.md
Enter fullscreen mode Exit fullscreen mode

The English segments came back mangled — I'd forced everything through one language assumption. The fix:

bl speech translate --input interview.mp3 --source auto --target en --output transcript_en.md
Enter fullscreen mode Exit fullscreen mode

--source auto detects the language per segment, and the transcript cleaned right up. Mid-sentence language switches still come out with rough edges.

Day 7: Chaining It

Every bl call is an independent process — no session, no memory, you re-specify the voice each time. Annoying interactively; exactly right in a script, because nothing hidden influences the output:

bl speech translate --input meeting.mp3 --source auto --target en --output transcript_en.md
bl speech asr --input meeting.mp3 --speaker-diarization --output transcript.md
# distill transcript.md into summary.txt (chat-model pass or manual pick), then:
bl speech tts --text "$(cat summary.txt)" --voice podcast-host --format mp3
Enter fullscreen mode Exit fullscreen mode

Recording in, narrated English brief out. Each stage debuggable in isolation. That week of experiments cost about a dollar total — per Bailian's official pricing (July 2026), TTS runs ~¥0.034 (≈ half a US cent) per minute of audio, ASR ~¥3.5 (≈ $0.50) per hour, speech translation ~¥0.5 (≈ $0.07) per minute.

Would I Keep Using It?

For the weekly grind — batch voiceovers, recorded meetings, bilingual interviews — yes; the file-shuttling between tabs is gone and the whole flow lives in a script I can rerun. For live meeting transcription I'd still open Otter.ai, for voice cloning or exact tonal work it's ElevenLabs or an actor, and if you touch audio once a month, a web tool with a preview button is simply less friction than a terminal.

Start here: install the CLI, get an API key, run one bl speech tts. The console shows what else the platform does.


What about you? Have you tried chaining audio tasks — TTS, transcription, translation — in a single scripted workflow? Team dedicated-tool or team pipeline? Drop your setup below.


All scenarios are based on real prompts. Command syntax reflects the current CLI version — check the official docs for updates.

Top comments (0)