{"record":{"id":"98bc01454863e418","repo":"tinyhumansai/openhuman","slug":"voice-install-piper-auto-install-on-voice-change","errorCode":null,"errorMessage":"[voice-install:piper] auto-install on voice change failed:","messagePattern":"\\[voice-install:piper\\] auto-install on voice change failed:","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/src/components/settings/panels/VoicePanel.tsx","lineNumber":1074,"sourceCode":"                    <label className=\"block space-y-1\">\n                      <span className=\"text-xs font-medium text-content-muted dark:text-content-secondary\">\n                        {t('voice.providers.piperVoice')}\n                      </span>\n                      <SettingsSelect\n                        aria-label={t('voice.providers.piperVoiceAria')}\n                        data-testid=\"tts-voice-select\"\n                        value={\n                          PIPER_VOICE_PRESET_IDS.some(v => v === ttsVoice) ? ttsVoice : '__custom__'\n                        }\n                        disabled={isSavingProviders}\n                        onChange={e => {\n                          const next = e.target.value;\n                          if (next === '__custom__') return;\n                          setTtsVoice(next);\n                          void persistProviders({ tts_voice: next });\n                          void installPiper({ voiceId: next }).catch(err =>\n                            console.warn(\n                              '[voice-install:piper] auto-install on voice change failed:',\n                              err\n                            )\n                          );\n                        }}\n                        className=\"w-full\">\n                        {piperVoicePresets.map(v => (\n                          <option key={v.id} value={v.id}>\n                            {v.label}\n                          </option>\n                        ))}\n                        <option value=\"__custom__\">{t('voice.providers.customVoiceOption')}</option>\n                      </SettingsSelect>\n                      {!PIPER_VOICE_PRESET_IDS.some(v => v === ttsVoice) && (\n                        <SettingsTextField\n                          aria-label={t('voice.providers.customVoiceAria')}\n                          data-testid=\"tts-voice-input\"\n                          value={ttsVoice}\n                          placeholder={t('voice.providers.customVoicePlaceholder')}","sourceCodeStart":1056,"sourceCodeEnd":1092,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/app/src/components/settings/panels/VoicePanel.tsx#L1056-L1092","documentation":"The automatic Piper TTS voice installation triggered by selecting a preset voice failed. When the user picks a Piper preset voice that is not yet installed, the panel kicks off an auto-install; this warn records that the install flow errored, leaving the selected voice configured but unavailable — synthesis with that voice will fail until a manual install succeeds.","triggerScenarios":"Thrown at app/src/components/settings/panels/VoicePanel.tsx:1074 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check the warned error for the install failure reason (download failure, checksum mismatch, disk space)","Retry via the panel's explicit install/repair action for the voice rather than re-selecting the preset","Verify network access to the voice artifact host and available disk space in the workspace","After a successful install, re-select the preset to confirm it resolves to the installed voice"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}