Just started using WellSaid for generating voiceovers for our deployment tutorial videos. The voice quality is great, but the studio feels clunky.
My main issue is the lag when switching between projects or generating a new line. It feels like waiting for a container to build without a cache. Has anyone else found this slows down their workflow? I'm wondering if it's just my setup or a known thing.
The lag isn't just you, it's a persistent symptom. But I'm more interested in what that latency actually represents. Is it front-end bloat, API gateway queuing, or a throttled compute layer?
You compared it to a slow container build. Fine, but have they published any incident postmortems or architecture deep dives? Without that transparency, "clunky" is just a user experience complaint masking a potential systemic issue. Have you checked network tab timings? The devil's in the distributed traces.
- Nina
>have they published any incident postmortems or architecture deep dives?
They haven't, and they won't. It's a black box SaaS. You're right to look at network timings though. If the TTFB is high, it's their backend. If the content download or scripting is slow, it's front-end bloat.
Either way, the fix is the same: stop using it for active editing. I script the generation via their API and only use the studio for final previews. Treat it like a slow CI job you kick off and walk away from.
YAML all the things.
Totally feel your point about distributed traces being the key. I've seen this pattern in cloud apps where the API gateway is fine but the real latency hides in IAM permission checks or slow datastore queries on the backend services.
If you're checking network timings and see inconsistent delays, it could be something like poorly configured concurrency on their inference endpoints. Each "generate" might be spinning up a new container instead of reusing a warm pool. No postmortems means we're left guessing though.
Have you tried checking if the lag is worse on longer projects? That might point to them loading a ton of context with each request.
security by default
Your container build analogy is apt. I've measured similar latency patterns in other SaaS editors and it often comes down to front-end state management, particularly with real-time collaboration features. Even if you're working solo, the studio might be loading full revision histories or project metadata synchronously before you can interact.
For a quick diagnostic, try opening browser dev tools before a project switch. Look at the network waterfall for calls to endpoints with `/project` or `/workspace` in the path. If you see a single, large JSON payload downloading, that's likely the culprit. They're probably fetching everything up front instead of using a lazy loading pattern.
The lag on generating a new line could be separate. That's more likely their inference queue, as others have noted. But project navigation slowness is usually a client-side architectural choice that's harder to fix without a full rewrite.
It's always the new users who notice the sluggishness first. Everyone else just gets numb to it.
>feels like waiting for a container to build without a cache
That's a generous comparison. At least a container build has a deterministic output and logs. The lag you're seeing could be anything from a bloated React state hydration to them silently paginating your entire workspace history. The real question is whether it scales or gets exponentially worse after 50 projects.
Check if the delay is consistent. If it varies wildly, you're probably hitting a shared, throttled backend service. Welcome to multi-tenant SaaS.
>poorly configured concurrency on their inference endpoints
Possible, but check the cold-start pattern. If the lag is only on the first generation after idle time, it's a classic serverless cold start. Consistent delays point to a queue or throttling. The variance is the diagnostic signal.
Longer projects likely fetch more metadata, not more inference context. That's a separate data plane issue.
Trust, but verify
Yeah, the studio lag is a known tax on productivity. I've seen it tied to how they hydrate the full project tree on every switch - they fetch all metadata, revisions, and even unused voice settings in one go. If you open the network tab, you'll likely see a 2MB JSON blob for a project with five lines.
The generation delay feels different though. That's probably their inference queue, but the project switching is pure front-end architecture debt. They're treating it like a monolithic SPA instead of a progressive editor.
YMMV
That point about fetching all metadata and unused settings is astute. It suggests a deeper design flaw than just payload size, specifically a failure to model the user's active context.
If they're fetching the full project tree, they're likely treating "project switch" as a full remount of the application state, forcing a re-render of the entire component tree. That's not just an oversized network call, it's a computational penalty paid in the main thread. The 2MB JSON blob then gets parsed, normalized into some internal store, and components re-evaluate all their selectors.
A more telling benchmark than the network payload would be the browser's Performance tab during a project switch. I'd expect to see a long "Scripting" block dominated by the framework's reconciliation process. This is the cost of a "monolithic SPA" where domain boundaries aren't reflected in the code structure. The front-end architecture is coupled to a backend data model that dumps everything, so the UI has to handle everything.
Trust but verify.
Exactly. Without those postmortems or deep dives, we're stuck reverse-engineering the architecture from our browsers, which is a frustrating exercise. I'd add a nuance to your point about distributed traces, though - even if we had them, they'd likely only show us symptoms within their own service boundaries. The real systemic issue might be in the orchestration layer between services, like how a project context is assembled from a dozen different microservices before a generation request is even routed to the inference endpoint.
Your call to check network timings is the right first step. But a high TTFB on a project switch endpoint, for instance, could still be masking a slow database join, not necessarily gateway queuing. It's all guesswork without that transparency.
The 2MB JSON for a small project confirms the hydration issue. I've logged similar payloads in browser sessions. The performance hit is in the parse and state normalization, not just the download.
It's worse than a monolithic SPA. They likely have a single, normalized Redux store or equivalent. Switching projects replaces the entire normalized entity state, forcing every connected component to re-evaluate. That's why the UI locks.
You could test by throttling CPU in dev tools. If the lag spikes disproportionately, it's the scripting, not the network.
EXPLAIN ANALYZE
You're right about the parse and state normalization being the hidden cost. I've seen Redux stores do this in other sales tools - swapping the whole normalized state triggers a cascade of selector recalculations that can freeze the UI for seconds.
It feels like a classic case of over-engineering for "clean architecture" at the cost of the actual user experience. They've built for a future scale that isn't the current bottleneck.
The CPU throttle test is a great idea. I'd also try switching projects with the browser console open and logging Redux actions. If you see a single, massive `SET_PROJECT` action instead of granular updates, that's your confirmation.
Spot on about the single massive action. It's the classic architectural rookie move of prioritizing a "single source of truth" over interaction latency. The irony is that this normalized state is supposed to prevent performance issues, not cause them.
But let's not give them too much credit for planning for future scale. This is more likely a case of cargo-culting state management patterns from blog posts without profiling the real user flow. Building for a scale you don't have is just building badly.
The real test after logging that action is to see if they're using any memoization on those selectors. My bet is they aren't, or it's broken. So every keystroke after the switch is still paying a tax on that 2MB blob.
Data skeptic, not a data cynic.