> ## Documentation Index
> Fetch the complete documentation index at: https://api.fanvue.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# AudioUpload

> Audio file upload with drag-and-drop and optional in-browser recording.

```tsx theme={null}
import { AudioUpload, useAudioRecorder } from "@fanvue/ui";
import type {
  AudioFileRejection,
  AudioUploadProps,
  AudioValidationError,
  UseAudioRecorderOptions,
  UseAudioRecorderReturn,
} from "@fanvue/ui";
```

## Examples

## Default

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-audioupload--default&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="280" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="AudioUpload — Default" />
</Frame>

```tsx theme={null}
import { AudioUpload } from "@fanvue/ui";

<AudioUpload className="w-80" />
```

## Disabled

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-audioupload--disabled&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="280" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="AudioUpload — Disabled" />
</Frame>

```tsx theme={null}
import { AudioUpload } from "@fanvue/ui";

<AudioUpload className="w-80" disabled />
```

## Without Recording

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-audioupload--without-recording&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="280" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="AudioUpload — Without Recording" />
</Frame>

```tsx theme={null}
import { AudioUpload } from "@fanvue/ui";

<AudioUpload className="w-80" allowRecording={false} />
```

## Short Max Duration

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-audioupload--short-max-duration&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="280" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="AudioUpload — Short Max Duration" />
</Frame>

```tsx theme={null}
import { AudioUpload } from "@fanvue/ui";

<AudioUpload className="w-80" maxRecordingDuration={10} />
```

## Custom Labels

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-audioupload--custom-labels&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="280" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="AudioUpload — Custom Labels" />
</Frame>

```tsx theme={null}
import { AudioUpload } from "@fanvue/ui";

<AudioUpload
  className="w-80"
  uploadTitle="Drop your audio here"
  uploadDescription="MP3, WAV, OGG — max 5MB"
  separatorText="or alternatively"
  recordButtonLabel="Use microphone"
  maxFileSize={5 * 1024 * 1024}
/>
```

## Props

## AudioUpload

Audio file upload with drag-and-drop and optional in-browser recording. Supports file validation, multiple files, and real-time waveform visualization during recording.

<ParamField path="accept" type="readonly string[]" default="[ &#x22;audio/mpeg&#x22;, &#x22;audio/ogg&#x22;, &#x22;audio/wav&#x22;, &#x22;audio/x-m4a&#x22;, &#x22;audio/mp4&#x22;, &#x22;audio/flac&#x22;, &#x22;audio/webm&#x22;, &#x22;audio/aac&#x22;, ] as const">
  Accepted audio MIME types.
</ParamField>

<ParamField path="allowRecording" type="boolean" default="true">
  Whether to show the record audio button.
</ParamField>

<ParamField path="disabled" type="boolean" default="false">
  Whether the component is disabled.
</ParamField>

<ParamField path="maxFiles" type="number" default="1">
  Maximum number of files per drop.
</ParamField>

<ParamField path="maxFileSize" type="number" default="10 * 1024 * 1024">
  Maximum file size in bytes.
</ParamField>

<ParamField path="maxRecordingDuration" type="number" default="30">
  Maximum recording duration in seconds.
</ParamField>

<ParamField path="minRecordingDuration" type="number" default="5">
  Minimum recording duration in seconds.
</ParamField>

<ParamField path="onFilesAccepted" type="((files: File[]) => void)">
  Called when valid files are accepted via drop or browse
</ParamField>

<ParamField path="onFilesRejected" type="((rejections: AudioFileRejection[]) => void)">
  Called when files are rejected (wrong type, too large, etc.)
</ParamField>

<ParamField path="onPermissionError" type="((error: Error) => void)">
  Called when microphone permission is denied or unavailable
</ParamField>

<ParamField path="onRecordingComplete" type="((blob: Blob, durationMs: number) => void)">
  Called when a recording completes and meets minimum duration
</ParamField>

<ParamField path="onRecordingError" type="((error: Error) => void)">
  Called when an unexpected recording error occurs
</ParamField>

<ParamField path="onRecordingTooShort" type="((durationMs: number, minDurationMs: number) => void)">
  Called when recording is stopped but does not meet minimum duration
</ParamField>

<ParamField path="recordButtonLabel" type="string" default="Record audio">
  Record button label.
</ParamField>

<ParamField path="separatorText" type="string" default="or">
  Separator text between upload and record.
</ParamField>

<ParamField path="stopButtonAriaLabel" type="string" default="Stop recording">
  Stop recording button aria-label.
</ParamField>

<ParamField path="uploadDescription" type="string" default="Audio files only, up to 10MB each">
  Upload area description text.
</ParamField>

<ParamField path="uploadTitle" type="string" default={"Click to upload, or drag & drop"}>
  Upload area title text.
</ParamField>

## useAudioRecorder

Hook for audio recording with MediaRecorder API. Provides recording controls, timer, and an AnalyserNode for waveform visualization.

Options passed to `useAudioRecorder`:

<ParamField path="maxDuration" type="number" default="30">
  Maximum recording duration in seconds.
</ParamField>

<ParamField path="minDuration" type="number" default="5">
  Minimum recording duration in seconds.
</ParamField>

<ParamField path="onComplete" type="((blob: Blob, durationMs: number) => void)">
  Called when recording completes successfully (meets minimum duration)
</ParamField>

<ParamField path="onError" type="((error: Error) => void)">
  Called on any recording error
</ParamField>

<ParamField path="onPermissionError" type="((error: Error) => void)">
  Called when microphone permission is denied or unavailable
</ParamField>

<ParamField path="onTooShort" type="((durationMs: number, minDurationMs: number) => void)">
  Called when recording is stopped but does not meet minimum duration
</ParamField>

## Exported types

Also exported from `@fanvue/ui`: `AudioFileRejection`, `AudioUploadProps`, `AudioValidationError`, `UseAudioRecorderOptions`, `UseAudioRecorderReturn`.

***

**Setup:** [Installation](/docs/ui/installation) · [Theming](/docs/ui/theming)
