Chapter 19

Voice assistants and LLM integration

Move from tapping a phone to speaking naturally. Configure Assist, speech-to-text and text-to-speech, entity exposure, voice hardware, and optional LLM conversation agents that can control your home.

Why this matters

You already built a dashboard in Chapter 6 and wrote an automation in Chapter 8. Neither helps when you carry a pot into the kitchen or cannot reach your phone from bed. In those moments, voice control is more practical than a dashboard.

Home Assistant’s built-in voice assistant is called Assist. Its basic features are included with Home Assistant. Unlike Google Assistant or Alexa, you can decide whether each processing stage runs locally or in the cloud.

After this chapter, you can:

  • Explain how Assist differs from a large language model (LLM).
  • Choose which entities voice assistants can control and which must remain private.
  • Build an Assist pipeline and choose local or cloud processing for each of its four stages.
  • Configure an OpenAI, Google, or Anthropic model as a conversation agent and allow it to control selected devices.
  • Explain the role of Model Context Protocol (MCP) in Home Assistant.
  • Evaluate cost, latency, and privacy trade-offs.
Concept: This chapter depends on your earlier setup. Assign devices to areas as described in Chapter 3, and give them clear names as described in Chapter 4. Unclear names make voice commands unreliable.

Assist: three terms to understand

Three related terms often cause confusion, so start by distinguishing them clearly.

TermPlain-English explanationWhere it appears
AssistHome Assistant’s name for its complete set of voice features, including typed and spoken conversations.The conversation icon in the upper-right corner and the three-dot menu in the mobile app
Conversation agentThe component that interprets your request. You can use the built-in agent or replace it with an LLM-based agent.Settings → Voice assistants → the assistant’s settings
Voice pipeline (Assist pipeline)The complete processing chain: wake word → speech-to-text → conversation agent → text-to-speech.Each assistant under Settings → Voice assistants represents a pipeline

The key point is that Home Assistant’s built-in conversation agent is a rule-based sentence matcher, not an LLM. It compares your request with predefined sentence patterns and triggers the corresponding intent when it finds a match. For example, “turn on the lights in the living room” can trigger HassTurnOn.

This design has two clear consequences:

  • Advantages: It is extremely fast, fully local, free to run, and does not invent responses. If you tell it to turn off a light, it turns off the light.
  • Limitations: A request that does not match a supported pattern may fail. For example, it may not understand “Could you make the living room darker?” It is also not designed for open-ended conversation.

The built-in agent has become more flexible. Version 2025.9 added a fuzzy matcher that can recognise an intent despite extra words or different phrasing. Home Assistant documentation notes that this feature was implemented in English first, with other languages to follow. Clear names and aliases therefore remain especially important in other languages.

Tip: Make common commands work with the built-in agent before adding an LLM. The built-in agent provides a fast, local, and predictable baseline; add an LLM only for requests that require more flexible language.

To try Assist without additional setup, sign in to Home Assistant, select the conversation icon in the upper-right corner, and type “turn on the living room light” or speak a sentence in your configured language. This is the simplest usable form of Assist.

A voice pipeline has four independently configurable stages

Think of a voice assistant as a production line. You speak a request; the pipeline turns it into an action and a reply. The four stages can each use either local or cloud processing.

#StagePurposeLocal optionsCloud options
1Wake word
(activation phrase)
Listens for the phrase that activates the assistant.openWakeWord (on the Home Assistant host), microWakeWord (on the device)None; wake-word detection is always local
2Speech-to-text
(STT)
Converts speech into text.Whisper, Speech-to-PhraseHome Assistant Cloud, OpenAI, Google Gemini
3Conversation agentInterprets the text and selects an action.Built-in Assist, Ollama (local LLM)OpenAI, Google, Anthropic
4Text-to-speech
(TTS)
Reads the reply aloud.PiperHome Assistant Cloud, OpenAI, Google Gemini
Concept: Mix local and cloud stages to suit your hardware, language, privacy requirements, and preferred voices. For example, use an on-device wake word, cloud speech-to-text, the built-in local conversation agent, and cloud text-to-speech. A pipeline does not have to be entirely local or entirely cloud-based.

For typed requests—for example, when using Assist from the mobile app—stages 1, 2, and 4 do not run; only the conversation agent is used. Connecting ChatGPT for typed conversation and speaking to a voice satellite therefore involve very different configurations.

Local processing options

  • Whisper: General-purpose speech-to-text with broad language support, including Chinese. The Home Assistant add-on defaults to auto; it selects tiny-int8 on ARM hardware such as a Raspberry Pi and base-int8 elsewhere. Larger models such as small and medium can improve recognition but require more CPU resources.
  • Speech-to-Phrase: Fast speech-to-text for a limited set of phrases derived from your Home Assistant configuration. It works on modest hardware but does not support unrestricted speech. Chinese is not currently listed as a supported language, so choose another engine if you need Chinese recognition.
  • Piper: Fast, resource-efficient local text-to-speech.
  • openWakeWord: Wake-word detection on the Home Assistant host. Home Assistant documentation states that a Raspberry Pi 4 can handle approximately 5 voice satellites streaming audio simultaneously. For larger installations, move wake-word detection to another machine.
Warning: Do not leave Whisper’s language setting at auto. Home Assistant documentation states that automatic language detection makes every request much slower. Specify the language spoken in your home.

These are all official add-ons. Once installed, Home Assistant discovers them through the Wyoming Protocol integration. Appendix A explains how to use the Add-on Store.

Entity exposure: decide what Assist can access

This is the most important—and most frequently missed—setting in this chapter. Home Assistant does not make every entity available to voice assistants. You must explicitly expose an entity before an assistant can access it. This is a deliberate safety measure.

  1. Open the exposure settings

    In the sidebar, select SettingsVoice assistants, then open the Expose tab.

  2. Review current exposure

    The list shows exposed entities and the assistants to which each one is exposed. This can include not only Assist, but also Google Assistant or Alexa if you have connected them.

  3. Expose only required entities

    Select Expose entities to add several entities at once. Select an individual entity to choose which assistants can access it.

  4. Add useful aliases

    Select an entity to add an alias. If the entity is named “living room main light” but your household calls it “main lamp,” add that phrase as an alias. You can also open the entity dialog, select the gear, and open Voice assistants.

  5. Remove sensitive controls

    Keep door locks, alarm systems, water heaters, and any device that creates heat or presents a safety risk off the exposure list unless you have assessed the risk carefully.

Danger: Exposing a door lock (lock) or alarm system (alarm_control_panel) may allow someone within microphone range to operate it. Keep these entities private unless you fully understand and accept the risk.

What happens if you expose too much?

Home Assistant’s guidance is straightforward: expose only the minimum necessary entities. Excessive exposure creates two problems:

When using the built-in conversation agentWhen using an LLM as a conversation agent
More names and aliases take longer to match, and similar names increase ambiguity. A request for the “room light” might select an air purifier’s indicator light.Every exposed entity adds context and token cost to the model request. A longer list also increases the chance of selecting the wrong device. The Ollama documentation recommends testing local models with fewer than 25 exposed entities.

Aliases for areas and floors

Entity exposure works with areas and floors. For “turn off all the lights in the living room” to work, those lights must belong to the living room area. You can also add aliases to areas and floors: go to SettingsAreas, labels & zones, select the pencil on an area card, then Add alias. For a floor, use its three-dot menu → Edit floorAdd alias.

Tip: Home Assistant recommends the naming pattern “area + description + device type,” such as “Living Room Table Lamp.” If the room has only one light, “Living Room Light” is sufficient. Replace manufacturer-generated names such as Tuya Light Controller 0E54B1 Light 1 with clear, speakable names. See Chapter 4.

Hands-on: build a local voice pipeline

Build an assistant that you can use from your phone. This example combines local Whisper, local Piper, and the built-in conversation agent. It is an inexpensive, privacy-conscious starting point.

  1. Install the speech-to-text add-on

    Go to SettingsAdd-onsAdd-on Store, find Whisper, and install it. Before starting the add-on, open its Configuration tab and change language from auto to the language you intend to use.

  2. Install the text-to-speech add-on

    Find Piper in the same store, install it, and start it.

  3. Accept Wyoming Protocol discovery

    Return to SettingsDevices & services. The Wyoming Protocol integration should automatically discover the two add-ons. Select Add for each one. If either is not discovered, select Add integration and search for Wyoming Protocol.

  4. Create an assistant

    Go to SettingsVoice assistants and select Add assistant. Enter a descriptive name, such as “Local Home,” and choose a language.

  5. Configure the pipeline stages

    On the same screen, set Conversation agent to Home Assistant. Under Speech-to-text, select the Whisper service you added and choose its language. Under Text-to-speech, select Piper and choose a voice. If you do not yet have a physical voice device, you can leave the wake-word setting unchanged.

  6. Expose entities

    Switch to the Expose tab and add only the lights, outlets, and fans that you want to control. Voice commands cannot operate entities that are not exposed.

  7. Test from your phone

    Open the Companion app installed in Chapter 7, then select the three-dot menu in the upper-right corner → Assist. Test with a typed request first. Once typed commands can control a light, select the microphone and test a spoken request.

  8. Set as default assistant

    After every stage works, return to SettingsVoice assistants and set this assistant as the default. All Assist entry points will then use it.

Warning: If the Assist section does not appear under SettingsVoice assistants, edit configuration.yaml, add assist_pipeline:, and restart Home Assistant. Installations that use default_config: normally include this integration already.

Cloud options: what Home Assistant Cloud provides

Home Assistant Cloud, operated by Nabu Casa, is the official subscription service; its revenue supports Home Assistant development. Its voice features include cloud speech-to-text and cloud text-to-speech.

ItemDetails
PriceUS$6.50/month, or US$65/year; EU: €7.50/month, or €75/year. The billed amount depends on your account region, payment method, and applicable taxes.
Trial31-day trial listed by the provider
Speech-to-textSupports many languages; choose one supported by your selected speech engine
Text-to-speechHome Assistant lists more than one hundred language and accent variants, including zh-TW. Many languages offer several voices.
Other included featuresSecure remote access, cloud backups, and connections to Google Assistant and Alexa
Tip: Language support and hardware requirements should guide this choice. Speech-to-Phrase does not support every language, while local Whisper needs a capable CPU to respond quickly. On a Raspberry Pi, cloud STT and TTS with the built-in local conversation agent may provide a more responsive multilingual setup.

After you subscribe and sign in, Home Assistant uses your language settings to create an assistant automatically. Go to SettingsVoice assistants, select the Home Assistant Cloud assistant, confirm the STT and TTS languages, and leave the conversation agent set to Home Assistant.

Concept: Home Assistant describes its cloud voice processing as transient: audio is deleted after it is converted to text, and voice data is not used to train models. Your voice still leaves your home, however, which is fundamentally different from an entirely local solution. The official documentation does not currently specify usage limits or quotas, so do not interpret that omission as a guarantee of unlimited use.

Connect an LLM as the conversation agent

The built-in agent recognises supported sentence patterns. If you want the assistant to interpret an indirect request such as “It’s a bit cold today; please do something about it,” or to respond in a particular style, consider using an LLM as the conversation agent.

Official integrations

Integration nameRequirementsFeatures
OpenAI ConversationOpenAI API keyHome Assistant documentation currently identifies gpt-4o-mini as the default model. Newer models may appear in the menu; because the list changes frequently, use the options shown in your installation. The integration creates four subentries: Conversation, AI Task, speech-to-text, and text-to-speech.
Google Generative AIGoogle AI Studio API key; a rate-limited free quota is available in supported regionsProvides a conversation agent, speech-to-text, and text-to-speech. Leave “Recommended settings” enabled unless you need to adjust the model parameters yourself.
AnthropicFunded Anthropic Console account and API keyOffers detailed options for prompt caching, extended thinking budgets, code execution, web search, and other features.
OllamaA separate machine running OllamaRuns locally with no per-token charge. Home Assistant labels control as Experimental, and only models with tool support can control Home Assistant.

Setup

  1. Add integration

    Go to SettingsDevices & servicesAdd integration. Search for OpenAI Conversation, Google Generative AI, Anthropic, or Ollama, then enter the API key or local URL requested on screen.

  2. Create a new assistant

    Go to SettingsVoice assistantsAdd assistant. Enter a name, then select the LLM integration under Conversation agent.

  3. Define its response style

    Select the gear beside the agent name to open its prompt template. For example, enter “You are a concise butler. Answer in no more than two sentences,” or define another appropriate persona. The field supports Home Assistant template syntax, so you can include current information.

  4. Enable control permissions

    On the same settings screen, enable Control Home Assistant. Without this permission, the model can converse but cannot operate devices. The next section explains the requirements in detail.

  5. Test by typing first

    Select “Start conversation” from the agent menu and test with typed requests first. Add speech-to-text and text-to-speech only after the conversation agent works, so you can isolate any later audio failure.

Warning: Speech-to-text and text-to-speech are configured independently of the conversation agent. Selecting an LLM conversation agent does not configure audio input or output; choose an engine for each of those stages separately.

Allow an LLM to control exposed entities

An LLM may reply that it turned off a light even though the light remains on. That usually means one of the following three requirements is not met.

First: enable Home Assistant control

The OpenAI, Google Generative AI, and Anthropic integrations include a Control Home Assistant option. Enable it to give the model the Assist API as a tool. When it is disabled, the model is only a chatbot.

In older versions, this setting may be a menu rather than a switch. Select Assist instead of “No control” to grant the same permission.

Second: expose the entity

This is the most common cause. The integration documentation states that a model can query or control only exposed entities. Enabling control without exposing any entities gives the model no available controls. Complete the earlier entity-exposure steps.

Third: verify that the model supports tool use

If you use a small local model through Ollama, remember that smaller models make more errors than larger ones. Home Assistant warns that small models may struggle to maintain a conversation when control is enabled. Its suggested workaround is to create two Ollama configurations: one without control for conversation, and another with control for device operations.

Concept: “Control Home Assistant” and entity exposure are independent gates; both must be enabled. This deliberate separation prevents a model from receiving control over every device by default.

Reduce cost and risk by preferring local handling

The assistant’s three-dot menu includes a Prefer handling commands locally switch. When enabled, Home Assistant first tries to match the request with the built-in conversation agent. A matching command runs locally; only an unmatched request is sent to the LLM.

This approach provides three benefits:

  • Speed: A simple command such as “turn on the living room lights” is handled locally with minimal delay.
  • Lower cost: Approximately 80% of routine commands can be handled without calling the LLM API or incurring token charges.
  • Reliability: Deterministic device commands are handled by the rule-based agent rather than delegated to a generative model.
Tip: Enable this switch in most installations. Leave it disabled only when you specifically need the LLM to handle every request—for example, in a multilingual household or when your usual phrasing rarely matches built-in sentence patterns.

Expose scripts as controlled capabilities

Scripts created in Chapter 10 can also be exposed to voice assistants. Wrap a sequence of complex actions in a clearly named script, expose that script, and let the model call it as one controlled capability. This is more reliable than asking the model to assemble a long action sequence.

Model Context Protocol (MCP): server and client roles

Model Context Protocol (MCP) is an open protocol that allows large language models to communicate with external tools. Home Assistant has described it as “a very thin layer that allows LLMs to connect to anything.” Home Assistant supports two directions through two separate integrations, which are easy to confuse.

MCP ServerMCP (client)
DirectionAn external AI client accesses Home AssistantUse external tools for your conversation agent
Integration nameModel Context Protocol ServerModel Context Protocol
Typical useControl Home Assistant from an external application such as Claude or ChatGPTGive an Assist conversation agent additional capabilities, such as memory or web search
SetupSettings → Devices & services → Add integration → Model Context Protocol Server; during setup, choose whether the client may control Home AssistantSettings → Devices & services → Add integration → Model Context Protocol; enter the SSE server URL and, if required, the OAuth client ID and secret
Endpoint/authenticationThe endpoint is /api/mcp. To select a particular LLM API, use /api/mcp/<api_id>; the built-in API is /api/mcp/assist. OAuth uses IndieAuth, with the application URL—for example, https://claude.ai—as the client ID. The client secret is not used and can be left blank. Clients without OAuth support use a long-lived access token.Currently supports MCP tools only; prompts, resources, sampling, and notifications are not supported.

The client integration was added in version 2025.2. Once configured, it makes external tools available to the conversation agent in the same way as Home Assistant’s native Assist API. You must still enable those tools in the conversation agent’s settings.

Danger: An MCP server gives an external service a path to Home Assistant controls. Expose only required entities, prefer OAuth to sharing long-lived access tokens, and never publish /api/mcp on the internet without protection. Review remote-access options in Appendix A.
Warning: MCP and application support are evolving quickly. The information above reflects the current Home Assistant documentation. If your interface differs, follow the options in your installed version and the latest Home Assistant integration documentation.

Add an external page to the sidebar

You may only need quick access to an AI page, not an API integration. Add the page to the Home Assistant sidebar so it opens inside the interface, which can be useful on a wall-mounted tablet.

Warning: The panel_iframe: YAML configuration found in older guides has been replaced by the Webpage dashboard. Home Assistant automatically migrates legacy iFrame panels during an upgrade. You do not need to convert an existing panel manually, but do not use panel_iframe for a new configuration.
  1. Go to dashboard settings

    SettingsDashboards.

  2. Add a dashboard

    Select Add dashboard, then choose Webpage from the list of types.

  3. Enter a name, icon, and URL

    Choose a name that is easy to recognise in the sidebar, select an icon, and enter the URL that you want to embed.

  4. Choose who can see it

    You can set whether only administrators can see it and whether it should be displayed in the sidebar. Use the administrator-only option when access should be restricted.

  5. Create and test the dashboard

    Return to the main screen and select the new sidebar item to confirm that the page loads.

Warning: Not every page can be embedded. Many websites, including AI services, send browser security headers that prohibit other sites from displaying them in an iframe. If such a site appears blank, the remote site—not your dashboard configuration—is blocking it. You cannot override that restriction. In addition, if Home Assistant uses HTTPS, the embedded page must also use HTTPS or the browser will block it as mixed content.

To embed a page within one dashboard view rather than create a full sidebar item, use a Webpage card. Add it using the card workflow described in Chapter 6.

Voice hardware: where to speak

Once the pipeline is configured, you need a device that can capture your request. The options below range from low-cost testing tools to dedicated hardware.

OptionCostWake wordBest use
Companion app (Android)FreeSupported; choose Hey Nabu, Hey Jarvis, or Hey MycroftMobile use and pipeline testing
Companion app (iPhone/iPad)FreeNo built-in wake word; trigger Assist with Shortcuts or approximate a wake word with Voice ControlMobile use when manual activation is acceptable
Repurposed wall-mounted tabletFree if already availableDepends on browser and app supportFixed locations such as an entrance or kitchen
DIY ESPHome voice deviceLow (approximately the cost of an ESP32-S3 development board)On-device microWakeWordCustom hardware for a specific location
Home Assistant Voice Preview EditionOfficial suggested retail price: US$69/€59Okay Nabu, Hey Jarvis, or Hey Mycroft, using on-device microWakeWordA convenient, ready-to-use dedicated device

How to call Assist on Android

  • In the app, open the three-dot menu in the upper-right corner and select Assist.
  • Set Home Assistant as the system’s default digital assistant, then launch it with the gesture configured by your device, such as swiping up from a lower corner or holding the power button. Once it is the default, you can also launch it from the lock screen.
  • Add a Home Assistant widget: touch and hold the Home screen → Widgets → Home Assistant, then drag the Assist widget into place.
  • Configure wake-word detection under SettingsCompanion appAssist for Android.

How to call Assist on iPhone

  • In the app, open the three-dot menu in the upper-right corner and select Assist.
  • Use the iOS Shortcuts app to create an Assist shortcut, then assign your preferred trigger: Back Tap, the Action button, Control Centre, or a Lock Screen widget.
  • Optional: iOS Voice Control can associate a custom phrase such as “Okay Nabu” with that shortcut. This is the closest iPhone equivalent to a wake word, but Home Assistant notes that it is slower than pressing a button or asking Siri. Voice Control also listens continuously, so assess that trade-off before enabling it.
  • Shortcuts triggered through Siri use Siri’s language rather than the pipeline language. For manually triggered shortcuts, you can select a language. To support two languages, import the shortcut twice and assign one language to each copy.

Official hardware: Voice Preview Edition

The Voice Preview Edition is the most straightforward dedicated option. It combines an ESP32-S3 with 16MB of flash and 8MB of PSRAM, plus an XMOS XU316 audio processor for echo cancellation, noise reduction, and automatic gain control. Its dual-microphone array is designed to hear commands while other audio is playing. It includes a built-in speaker, a 3.5mm audio output, a physical mute switch, a volume dial, an LED ring, and a Grove expansion port for sensors. It measures 84×84×21mm and weighs 96 grams. It does not require Home Assistant Cloud and can run with an entirely local pipeline, although Home Assistant recommends a relatively capable host—approximately an Intel N100 or better—for the complete local experience.

Tip: Starting with version 2025.10, each Assist voice satellite can use up to two wake words, each assigned to a different pipeline. For example, assign “Okay Nabu” to a fast local pipeline and “Hey Jarvis” to a cloud LLM pipeline. The wake word determines which pipeline runs. A multilingual household can also assign one wake word to each language.

Voice satellites can initiate interactions

Voice devices do not have to wait passively for a command. The assist_satellite domain provides three actions for use in automations:

actions:
  - action: assist_satellite.announce
    target:
      entity_id: assist_satellite.living_room
    data:
      message: The washing machine is ready

The other actions are assist_satellite.start_conversation (start a conversation) and assist_satellite.ask_question (ask a question and capture the answer). For example, after a door opens, an entryway satellite can ask whether to turn on the living-room lights and act on the reply.

Avoid starting an announcement while the satellite is already interacting with someone, because the two messages can overlap. Starting with version 2026.2, automation conditions can check whether a voice satellite is idle, listening, processing, or responding. Before an announcement, add a condition that requires the satellite to be idle so that it does not interrupt a household member.

Tip: Starting with version 2025.10, a command that affects the satellite’s own area—for example, saying “turn on the lights” to a living-room satellite—can be acknowledged with a short chime instead of a full spoken confirmation. The shorter response makes routine commands feel noticeably faster.

Privacy, cost, and latency: balancing the trade-offs

There is no single best configuration. Use this comparison to choose the balance that suits your household.

CombinationPrivacyCostResponse speedLanguage support
Entirely local (Whisper + built-in agent + Piper)Highest; voice data stays at homeNo service fee, but requires a capable hostDepends on the CPU; a Raspberry Pi may respond noticeably slowlyWhisper supports Chinese, but small models make more recognition errors
Cloud voice + built-in agentAudio passes through Nabu Casa; Home Assistant states that it is neither retained nor used for trainingAbout US$6.5/monthFast; typically one or two secondsGood; official support includes zh-TW
Cloud voice + cloud LLM agentAudio and the exposed home-device list are sent to service providersSubscription fee plus per-conversation token chargesSlowest because it adds a model round tripBroadest; handles indirect phrasing well
Entirely local + Ollama local LLMHighestNo token charge, but generally requires GPU-class hardwareDepends on the host and is often slowerDepends on the model; small models often perform poorly in Chinese
Tip: LLM response times improved substantially in version 2025.10. Previously, the model had to generate its entire response before text-to-speech could begin. TTS can now synthesise text as it streams; Home Assistant reports that speech begins approximately ten times faster. If an earlier LLM setup felt unusably slow, it may be worth testing again.

Control token costs

Cloud LLMs are billed by usage, and provider prices change frequently. Check each provider’s current pricing rather than relying on fixed figures here. The following practices help prevent unexpected charges:

  • Every request includes the exposed-entity list. Exposing 200 entities can cost an order of magnitude more than exposing 20.
  • Long prompt templates are charged on every request. Keep persona instructions to three to five concise sentences rather than writing an extensive backstory.
  • Enable “Prefer handling commands locally.” Routine commands that match locally will not call the API. This is the most effective cost-control setting.
  • Set a usage limit in the provider’s console before adding the API key. OpenAI, Google, and Anthropic all provide spending or usage controls.
Danger: Treat an API key like a payment credential. Never include it in forum posts, screenshots, GitHub repositories, or support messages. If a key is exposed, revoke it immediately in the provider’s console and issue a replacement.
Concept: Latency is critical to usability. If a light takes more than three seconds to respond after a command, household members may stop using voice control. If you can optimise only one aspect, minimise the response time for your five most common commands.

Troubleshooting

  1. No device responds, and Assist says “Sorry, I don’t know about that”

    First confirm that the entity is exposed under SettingsVoice assistantsExpose. Next, compare the spoken name with the entity name and aliases; add the phrase your household actually uses. Finally, verify the entity’s area assignment as described in Chapter 3.

  2. You cannot identify which pipeline stage failed

    Use the built-in debugging tools. Go to SettingsVoice assistants, select your assistant, and open the Debug dialog. Choose the latest run from the menu to inspect the recognised text and the time spent in each stage. From the icon in the upper-right corner of the debug screen, select Run text pipeline to test the complete text-processing path with a typed sentence.

  3. You want to test sentence parsing without running an action

    Use Assist’s sentence-pattern testing tool under SettingsToolsAssist. It reports the parsed intent and targeted entities but does not execute the action. This is the quickest way to validate a renamed entity or a new alias.

    If you cannot find Tools, check your version. Before this change, this section is called Developer tools and appears at the bottom of the sidebar. Starting with version 2026.2, it appears as Tools at the bottom of Settings. On a computer, press Ctrl + K—or Cmd + K on a Mac—to open Quick search, then enter “tools” or “developer.”

  4. It responds but produces no sound

    First check SettingsSystemNetwork and confirm that the Local network Home Assistant URL is correct. The voice device uses this URL to retrieve generated audio; an incorrect URL can produce a visible response with no sound. If you maintain YAML manually without default_config:, also confirm that media_source: is present.

  5. Assist recognises an entity only when I use its full formal name

    Add an alias under SettingsVoice assistantsExpose → select the entity. An entity can have multiple aliases, so add the everyday terms used by different household members or languages.

  6. A request for one entity controls another

    This usually results from exposing too many entities with similar names. First remove entities that do not need voice access. Then rename easily confused entities using the “area + description” pattern. Also verify each entity’s domain and device class; Assist cannot infer that a valve represented incorrectly as a switch should respond to “open.”

  7. Local Whisper is unacceptably slow

    Try three adjustments. First, change language from auto to a specific language; automatic detection is much slower. Second, choose a smaller model such as the int8-compressed tiny-int8 or base-int8. Third, move speech-to-text to Home Assistant Cloud while keeping the conversation agent local. Whisper’s default beam_size is 0, which automatically uses 1 on ARM systems and 5 on other systems. A larger value may improve accuracy but increases processing time.

  8. The wake word is frequently missed or triggers unexpectedly

    First determine whether wake-word detection runs on the device with microWakeWord or on the host with openWakeWord. For host-based detection, Home Assistant states that a Raspberry Pi 4 can support approximately 5 simultaneous satellite streams; additional streams may cause delays. For on-device detection, review the microphone gain and noise-suppression settings in the device’s ESPHome configuration.

  9. The LLM claims to have acted, but nothing happened

    This is a common model hallucination. Check, in order, that Control Home Assistant is enabled in the integration settings, that the entity is exposed, and that the model is capable enough for reliable tool use. Small local models may struggle even to maintain a conversation after control is enabled. Enable “Prefer handling commands locally” so that deterministic commands bypass the model.

  10. An embedded sidebar page is blank

    The remote site may use browser security headers that prohibit iframe embedding. You cannot override this restriction; use a different site or open the page in a new tab. Also check that you are not embedding an HTTP page in an HTTPS Home Assistant instance.

FAQ

Do I have to pay for Home Assistant Cloud to use voice?
No. Assist is included with Home Assistant, and Whisper, Piper, and openWakeWord are free official add-ons. A Cloud subscription reduces local hardware requirements and provides cloud speech recognition and text-to-speech, including Chinese-language options. If Home Assistant runs on a Raspberry Pi and you need Chinese, a subscription may cost less than a hardware upgrade. If you have a capable spare computer, an entirely local configuration is feasible.
How does built-in Assist differ from ChatGPT? Do I need an LLM?
Built-in Assist matches supported sentence patterns. It is fast, free, local, and predictable, but it is not designed for open-ended conversation. An LLM understands more flexible phrasing and supports ongoing conversations, but adds latency, usage cost, and the possibility of hallucination. A practical setup is to use both: select the LLM as the conversation agent and enable “Prefer handling commands locally”. Simple commands stay local, while unmatched requests go to the LLM.
If I paste the API key into Home Assistant, will my family’s data be used to train the model?
It depends on the provider and its current API terms; Home Assistant does not control those policies. Review the provider’s data-use policy directly. You can control how much data is shared: expose only necessary entities, because the model sees only those entities. Do not expose door locks, cameras, or entities that reveal personal information. If no data may leave your home, run a local model through Ollama or use the built-in conversation agent.
Can I ask a voice assistant to unlock a door or disarm a security system?
It is technically possible by exposing a lock or alarm_control_panel entity, but it is strongly discouraged. Voice control cannot reliably identify the speaker, and someone outside may be heard through a window. If you accept this risk, put the operation in a script and add safeguards—for example, require a particular phone to be at home and restrict the permitted time range. Chapter 10 explains scripts.
Chinese recognition is inaccurate. What should I optimise first?
Follow this order: 1. Set the speech-to-text engine to the appropriate Chinese language instead of auto. 2. Give devices short, natural names—“Living Room Light” is clearer than “Living Room Ceiling Light Set 1”—and add the terms your household uses as aliases. Third: If a small local Whisper model is inaccurate, choose a larger model or switch to Home Assistant Cloud speech-to-text, which lists zh-TW. Fourth: If necessary, use an LLM conversation agent to tolerate transcription errors. Speech-to-Phrase does not currently list Chinese, so it is not an option for this use case.
Can I teach Assist a phrase that it does not understand?
Yes. For a UI workflow: go to SettingsAutomations & scenesCreate automation, add a Sentence trigger, enter the phrase, and add the intended action. For a configuration-file workflow: extend an existing intent in configuration.yaml:
conversation:
  intents:
    HassTurnOn:
      - "activate [the] {name}"
For more control, place a YAML file in config/custom_sentences/<language_code>/; for English, use config/custom_sentences/en/. You can define custom intents, lists, and numeric ranges, and customise responses by adding responses.yaml to the same directory. Restart Home Assistant after changing these files.
Can one speaker support both Chinese and English speakers?
Yes. Starting with version 2025.10, every Assist voice satellite supports up to two wake words, each assigned to a separate pipeline. Assign “Okay Nabu” to one language and “Hey Jarvis” to another. The same mechanism can separate a fast local pipeline from a cloud LLM pipeline; the wake word determines which one runs.
Do I need MCP?
Not for ordinary voice control. MCP is useful in two situations: when an external application such as Claude or ChatGPT needs to operate Home Assistant through the Model Context Protocol Server integration at /api/mcp, or when a Home Assistant conversation agent needs external tools such as memory or web search through the Model Context Protocol client integration. The client was added in version 2025.2 and currently supports tools only. Both uses grant additional access, so minimise the exposed-entity list before configuration.
An external AI site is blank in the sidebar. Is the configuration wrong?
Usually not. Many sites use browser security headers to prohibit embedding in other pages, and you cannot bypass that restriction. Also confirm that the protocols match: if Home Assistant uses HTTPS, the embedded URL must also use HTTPS. The panel_iframe: YAML configuration in older guides has been replaced by the Webpage dashboard and is migrated automatically during an upgrade. For a new page, use SettingsDashboardsAdd dashboardWebpage.
Can an automation ask AI to perform a task?
Yes, in two ways. The conversation.process action sends text to a selected conversation agent, providing a programmatic equivalent of speaking to Assist. Alternatively, the AI Task building-block integration, added in version 2025.7, provides the ai_task.generate_data and ai_task.generate_image actions. These actions generate text, structured data, or images in an automation—for example, analysing a camera image to count cars in a lane. This is cleaner than assembling many templates manually.