DEV Community

zi zong
zi zong

Posted on

Your AI Voice App Has 500+ Voices. How Should Users Find the Right One?


Ten voices can fit in a simple list. At one hundred, filters start earning their place. At one thousand, discovery becomes a system of its own.

The hard question is no longer:

Can the system generate speech?

It is:

Can someone find the right voice without opening dozens of unrelated samples?

This looks like a UI problem, but the interface is only the visible part. Underneath it are decisions about data modeling, retrieval, ranking, and content management.

If I were building an AI voice application with a growing catalog, I would treat voice selection as a pipeline of its own, not as a dropdown placed in front of the Generate button.

Start with a voice schema that supports decisions

Before working on search, I would define what a voice means inside the application. A minimal record might look like this:

{
  "voice_id": "voice_0042",
  "languages": ["en", "ja"],
  "style": "calm",
  "pace": "medium",
  "use_cases": ["narration", "education"],
  "source_type": "shared",
  "preview_url": "/previews/voice_0042.mp3",
  "usage_notes": "Suitable for non-character narration"
}
Enter fullscreen mode Exit fullscreen mode

The audio file is only one part of that record. The metadata is what makes the voice findable.

  • voice_id gives the system a stable identifier.
  • languages removes incompatible results early.
  • style describes the general delivery.
  • pace separates slower narration from faster conversational speech.
  • use_cases groups voices by the work they suit.
  • source_type distinguishes private, shared, and synthetic assets.
  • usage_notes carries context that does not fit neatly into a category.

Without those fields, a catalog eventually turns into a folder full of audio. With them, the application has something it can query.

Filter before reaching for semantic search

It is tempting to turn every discovery feature into an embedding problem. I would start with ordinary structured filters.

Suppose the request is:

Language: Japanese
Style: Calm
Use case: Education
Enter fullscreen mode Exit fullscreen mode

The first pass can be quite literal:

all voices
↓
Japanese voices
↓
calm Japanese voices
↓
calm Japanese voices suitable for education
Enter fullscreen mode Exit fullscreen mode

Ranking can happen after that reduction. This approach is easier to inspect and debug. If someone asks why a result appeared, the answer comes from fields in the record rather than an opaque similarity score.

Preview belongs inside the retrieval loop

Voice search does not behave like image search. A thumbnail often tells you enough to reject an image; a voice usually has to be heard.

Preview is therefore part of retrieval, not a secondary feature:

search
↓
filter
↓
preview
↓
shortlist
↓
generate test
Enter fullscreen mode Exit fullscreen mode

That affects the design of each result. A useful voice card might show:

  • Voice name
  • Language and style
  • Preview duration
  • Play button
  • Usage notes

There is no need to expose every stored field. The card only needs enough information to help someone decide whether the sample is worth playing.

Keep the first ranking function boring

After filtering, I would try a small deterministic score before adding a recommendation system:

function scoreVoice(voice, query) {
  let score = 0;

  if (voice.languages.includes(query.language)) {
    score += 4;
  }

  if (voice.style === query.style) {
    score += 3;
  }

  if (voice.use_cases.includes(query.useCase)) {
    score += 2;
  }

  if (voice.pace === query.pace) {
    score += 1;
  }

  return score;
}

const rankedVoices = voices
  .map((voice) => ({
    ...voice,
    score: scoreVoice(voice, query)
  }))
  .sort((a, b) => b.score - a.score);
Enter fullscreen mode Exit fullscreen mode

The scoring is intentionally plain. Early on, predictable ranking is often more useful than a clever system that nobody can explain. Once real selection data exists, the weights and fields can change without replacing the whole pipeline.

Metadata should reflect actual selection behavior

Another trap is adding fields because the schema looks more complete with them.

Labels such as these sound reasonable:

Warm
Bright
Calm
Energetic
Conversational
Professional
Enter fullscreen mode Exit fullscreen mode

But a label earns its place only when it changes a decision. If people never filter by Bright, or cannot agree on what it means, storing it may add noise instead of structure.

The better question is: what information causes someone to choose one voice over another?

While thinking through this interface, I found it useful to look at existing catalogs, including the FreeVoiceClone voice library, with that question in mind. The number of available voices matters less than whether the interface provides enough information to compare two candidates.

A catalog becomes easier to use when its metadata follows real selection behavior rather than an imagined taxonomy.

Provenance belongs in the same data model

Voice assets are not quite like fonts or icons. A voice may be tied to a person's identity, permission, or a particular source, so provenance cannot be left for a separate policy page.

A record may eventually need fields such as:

{
  "source_type": "shared",
  "visibility": "public",
  "permission_status": "verified",
  "intended_use": ["narration", "education"],
  "created_at": "2026-09-24"
}
Enter fullscreen mode Exit fullscreen mode

The exact schema will depend on the product. What matters is keeping provenance and intended use beside the asset they describe.

If a voice is easy to discover but its origin is unclear, retrieval has solved only half of the problem.

A voice catalog also needs lifecycle states

Once several people can create, review, and publish voices, the catalog needs lifecycle information as well:

draft
↓
reviewed
↓
published
↓
deprecated
Enter fullscreen mode Exit fullscreen mode

The corresponding record could include:

{
  "status": "published",
  "reviewed_by": "user_102",
  "version": 3,
  "updated_at": "2026-09-24"
}
Enter fullscreen mode Exit fullscreen mode

These fields become useful as soon as audio or metadata can change. Without them, even basic questions are awkward to answer:

  • Which version is public?
  • Who reviewed it?
  • Did the metadata change after the audio?
  • Should an older voice still appear in search?

This is a familiar content-management problem. The content just happens to be audio.

Search becomes part of the product architecture


As the catalog grows, voice search starts affecting the whole experience. A basic architecture might look like this:

Voice assets
    ↓
Metadata store
    ↓
Filter layer
    ↓
Ranking
    ↓
Preview
    ↓
User selection
    ↓
Generation
Enter fullscreen mode Exit fullscreen mode

Generation is near the end of this flow. A user may spend more time finding and checking a voice than producing the final audio, which changes where engineering effort should go.

Add semantic search when structured filters stop being enough

I would add semantic search after users begin expressing needs that fixed fields cannot capture well, for example:

A calm voice that sounds suitable for a documentary.

Or:

Friendly, but not too energetic.

An embedding-based layer or an LLM query parser could translate those requests into structured constraints:

{
  "style": ["calm", "professional"],
  "use_case": ["narration", "documentary"],
  "energy": "low"
}
Enter fullscreen mode Exit fullscreen mode

The existing filter and ranking pipeline can still do most of the work. Semantic search becomes an input layer instead of a replacement for the rest of the system.

The harder product work starts after generation works

AI voice products are often demonstrated through generation quality. That makes sense: realism is immediate and easy to hear.

Once generation is good enough, a different set of questions takes over:

  • How should voices be organized?
  • How can users search and compare them?
  • Is the source of each voice clear?
  • Which fields belong in ranking, and which only belong in the details view?

These are product and data-design questions, not model questions.

With ten voices, almost any interface works. With one thousand, metadata, filtering, preview, ranking, provenance, and lifecycle state are part of the core system.

Generation creates the asset. Information architecture makes it usable.

Top comments (0)