Direct answer — short:
I can walk you through how to make voiceline popups for a Roblox JJS Limbus Company-style experience (play sound, show a dialogue bubble with the speaker name/portrait, timed and optionally networked for all players). Below I give a clear, step-by-step implementation plan with example Lua code you can adapt for LocalScripts/ServerScripts and RemoteEvents in Roblox Studio.

Quick notes up front:

  • Use Roblox Audio assets (upload or use library) and play them via sound objects or a voicelines module.
  • Show UI popups with ScreenGuis for the local client (or replicate via RemoteEvents for everyone).
  • Many community examples and modules exist (voicelines modules, dialogue box mods) you can reference for structure and IDs.

What you need (resources)

  • Audio files / Asset IDs for each voiceline (upload to Roblox or find library assets).
  • A ScreenGui in ReplicatedFirst or StarterGui containing a Template Frame for dialogue/voiceline popups.
  • A RemoteEvent (e.g., ReplicatedStorage.PlayVoiceline) so the server can tell clients to show popups and play sounds.
  • Optional: a centralized Voicelines Module to organize categories, durations, cooldowns, and voice priorities.

Implementation overview (recommended architecture)

  1. Server holds the authoritative trigger (an enemy/identity or game event) and fires a RemoteEvent with voiceline metadata (voiceline ID, speaker name, portrait asset, playForAll boolean).
  1. Client receives the event and: loads/sets the UI bubble text and portrait, creates or reuses a Sound object, plays sound, plays a little animation (fade/slide), and auto-hides when the voiceline finishes.
  1. Optional: implement a small queue on clients so overlapping voicelines stack, priority interrupts lower-priority lines, or identical lines have cooldowns.

Example code (templates to adapt)

  • ServerScript (simplified): creates/uses a RemoteEvent and fires with metadata.
    • Sends: {Id = 12345678, Name = "Vergilius", PortraitId = 98765432, Text = "You will fall!", Duration = 3, PlayForAll = true}.
  • Client LocalScript (simplified): listens for PlayVoiceline, populates a ScreenGui template, plays audio, animates, then removes.

Use these building blocks:

  • RemoteEvent: ReplicatedStorage.PlayVoiceline.
  • ScreenGui template: ImageLabel for portrait, TextLabel for text, UIListLayout or tween for animation.
  • Sound handling: create Sound under StarterPlayerScripts or under the UI, set Sound.SoundId to "rbxassetid://" and call :Play().

Useful community references

  • Voicelines module examples and community threads with ready patterns for queuing, categories, and caching.
  • Limbus Company dialogue mods that map voiceline IDs to on-screen speech bubbles (useful for understanding mapping between voiceline ID and displayed text).
  • Walkthrough guides for creating voicelines in Roblox Studio (uploading audio and using Sound objects).

Short example snippet (pseudo-Lua)

  • Server triggers:
    • Fire the RemoteEvent with a table {Id, Name, PortraitId, Text, Duration}.
  • Client handles:
    • Create or clone template UI, set text and image, set Sound.SoundId, :Play(), TweenPosition/Transparency for entrance/exit, Destroy after Duration + fade.

If you want, I can:

  • Provide full, copy-paste Lua scripts for the ServerScript, LocalScript, a ScreenGui template (as XML-like description) and a basic Voicelines Module for queuing and priority; or
  • Make a minimal tutorial that walks you through creating the assets in Roblox Studio step-by-step (where to put RemoteEvent, how to upload sound, how to build the UI).

Tell me which you prefer (full scripts vs step-by-step Studio tutorial) and whether you want features like network-wide voicelines, queuing, or priority/interrupts — I’ll produce the code and UI template ready to paste into Roblox Studio.

Bottom note: Information gathered from public forums and documentation available on the internet and portrayed here.