{"record":{"id":"0d85025c0dc1b354","repo":"langgenius/dify","slug":"unsupported-audio-type","errorCode":"unsupported_audio_type","errorMessage":"Audio type not allowed.","messagePattern":"Audio type not allowed\\.","errorType":"error_code","errorClass":"UnsupportedAudioTypeError","httpStatus":415,"severity":"error","filePath":"api/controllers/console/app/audio.py","lineNumber":159,"sourceCode":"            )\n        else:\n            response = AudioService.transcript_agent_asr(\n                app_model=app_model,\n                agent_soul=agent_soul,\n                file=file,\n                session=session,\n                end_user=None,\n            )\n        return dump_response(AudioTranscriptResponse, response)\n    except services.errors.app_model_config.AppModelConfigBrokenError:\n        logger.exception(\"App model config broken.\")\n        raise AppUnavailableError()\n    except NoAudioUploadedServiceError:\n        raise NoAudioUploadedError()\n    except AudioTooLargeServiceError as e:\n        raise AudioTooLargeError(str(e))\n    except UnsupportedAudioTypeServiceError:\n        raise UnsupportedAudioTypeError()\n    except ProviderNotSupportSpeechToTextServiceError:\n        raise ProviderNotSupportSpeechToTextError()\n    except SpeechToTextDisabledServiceError:\n        raise SpeechToTextDisabledError()\n    except ProviderTokenNotInitError as ex:\n        raise ProviderNotInitializeError(ex.description)\n    except QuotaExceededError:\n        raise ProviderQuotaExceededError()\n    except ModelCurrentlyNotSupportError:\n        raise ProviderModelCurrentlyNotSupportError()\n    except InvokeError as e:\n        raise CompletionRequestError(e.description)\n    except HTTPException:\n        raise\n    except ValueError:\n        raise\n    except Exception as e:\n        logger.exception(\"Failed to transcribe audio to text\")","sourceCodeStart":141,"sourceCodeEnd":177,"githubUrl":"https://github.com/langgenius/dify/blob/ef8544b173fd6cd7a8e71df2cab576e52bebbfbc/api/controllers/console/app/audio.py#L141-L177","documentation":"Raised by _transcribe_audio_to_text when AudioService raises UnsupportedAudioTypeServiceError — the uploaded audio's MIME type or extension is not in the allowed set for speech-to-text. Translated to UnsupportedAudioTypeError (HTTP 415, error_code 'unsupported_audio_type').","triggerScenarios":"Uploading a format the STT provider rejects: .wav, .m4a, .ogg, .flac when only .mp3 is supported (the OpenAPI doc describes the param as 'MP3 audio to transcribe'), or an unknown/ambiguous content type.","commonSituations":"Browser recorder producing webm/ogg; user attaching a voice memo in m4a; Content-Type header missing so the service cannot infer the format.","solutions":["Convert the audio to MP3 before uploading (ffmpeg -i in.wav out.mp3).","Set the correct Content-Type and filename extension on the multipart part.","Configure the recorder to output an accepted container/codec.","Check the provider's supported formats in the model provider settings."],"exampleFix":"// before\nform.append('file', wavBlob, 'message.wav');\n\n// after: convert to mp3 client-side or server-side first\nform.append('file', mp3Blob, 'message.mp3');","handlingStrategy":"validation","validationCode":"const ALLOWED = ['audio/mpeg', 'audio/mp3'];\nfunction assertAllowedAudio(file) {\n  if (!ALLOWED.includes(file.type) && !/\\.mp3$/i.test(file.name)) throw new Error('Only MP3 audio is supported');\n  return file;\n}","typeGuard":"const isAllowedAudio = (f) => ALLOWED.includes(f.type) || /\\.mp3$/i.test(f.name);","tryCatchPattern":"try { await axios.post(`/apps/${id}/audio-to-text`, form); }\ncatch (e) { if (e.code === 'unsupported_audio_type') { /* convert to mp3 then retry */ } }","preventionTips":["Configure recorders to output MP3 or convert before upload.","Set the correct filename extension and Content-Type on the part.","Filter accepted types in the UI input."],"tags":["audio","asr","file-upload","validation","console-api","model-provider"],"backgroundTag":null,"analyzedSha":"ef8544b173fd6cd7a8e71df2cab576e52bebbfbc","analyzedAt":"2026-08-12T05:15:17.394Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}