@siteed/expo-audio-studio
Version:
Comprehensive audio processing library for React Native and Expo with recording, analysis, visualization, and streaming capabilities across iOS, Android, and web
532 lines • 20.9 kB
TypeScript
import { AudioAnalysis, AudioFeaturesOptions, DecodingConfig } from './AudioAnalysis/AudioAnalysis.types';
import { AudioAnalysisEvent } from './events';
export interface CompressionInfo {
/** Size of the compressed audio data in bytes */
size: number;
/** MIME type of the compressed audio (e.g., 'audio/aac', 'audio/opus') */
mimeType: string;
/** Bitrate of the compressed audio in bits per second */
bitrate: number;
/** Format of the compression (e.g., 'aac', 'opus') */
format: string;
/** URI to the compressed audio file if available */
compressedFileUri?: string;
}
export interface AudioStreamStatus {
/** Indicates whether audio recording is currently active */
isRecording: boolean;
/** Indicates whether recording is in a paused state */
isPaused: boolean;
/** Duration of the current recording in milliseconds */
durationMs: number;
/** Size of the recorded audio data in bytes */
size: number;
/** Interval in milliseconds at which recording data is emitted */
interval: number;
/** Interval in milliseconds at which analysis data is emitted */
intervalAnalysis: number;
/** MIME type of the recorded audio (e.g., 'audio/wav') */
mimeType: string;
/** Information about audio compression if enabled */
compression?: CompressionInfo;
}
export interface AudioDataEvent {
/** Audio data as base64 string (native) or Float32Array (web) */
data: string | Float32Array;
/** Current position in the audio stream in bytes */
position: number;
/** URI to the file being recorded */
fileUri: string;
/** Size of the current data chunk in bytes */
eventDataSize: number;
/** Total size of the recording so far in bytes */
totalSize: number;
/** Information about compression if enabled, including the compressed data chunk */
compression?: CompressionInfo & {
/** Base64 (native) or Blob (web) encoded compressed data chunk */
data?: string | Blob;
};
}
export type EncodingType = 'pcm_32bit' | 'pcm_16bit' | 'pcm_8bit';
export type SampleRate = 16000 | 44100 | 48000;
export type BitDepth = 8 | 16 | 32;
export type PCMFormat = `pcm_${BitDepth}bit`;
export type ConsoleLike = {
/** Logs a message with optional arguments */
log: (message: string, ...args: unknown[]) => void;
/** Logs a debug message with optional arguments */
debug: (message: string, ...args: unknown[]) => void;
/** Logs an info message with optional arguments */
info: (message: string, ...args: unknown[]) => void;
/** Logs a warning message with optional arguments */
warn: (message: string, ...args: unknown[]) => void;
/** Logs an error message with optional arguments */
error: (message: string, ...args: unknown[]) => void;
};
export interface Chunk {
/** Transcribed text content */
text: string;
/** Start and end timestamp in seconds [start, end] where end can be null if ongoing */
timestamp: [number, number | null];
}
export interface TranscriberData {
/** Unique identifier for the transcription */
id: string;
/** Indicates if the transcriber is currently processing */
isBusy: boolean;
/** Complete transcribed text */
text: string;
/** Start time of the transcription in milliseconds */
startTime: number;
/** End time of the transcription in milliseconds */
endTime: number;
/** Array of transcribed text chunks with timestamps */
chunks: Chunk[];
}
export interface AudioRecording {
/** URI to the recorded audio file */
fileUri: string;
/** Filename of the recorded audio */
filename: string;
/** Duration of the recording in milliseconds */
durationMs: number;
/** Size of the recording in bytes */
size: number;
/** MIME type of the recorded audio */
mimeType: string;
/** Number of audio channels (1 for mono, 2 for stereo) */
channels: number;
/** Bit depth of the audio (8, 16, or 32 bits) */
bitDepth: BitDepth;
/** Sample rate of the audio in Hz */
sampleRate: SampleRate;
/** Timestamp when the recording was created */
createdAt?: number;
/** Array of transcription data if available */
transcripts?: TranscriberData[];
/** Analysis data for the recording if processing was enabled */
analysisData?: AudioAnalysis;
/** Information about compression if enabled, including the URI to the compressed file */
compression?: CompressionInfo & {
/** URI to the compressed audio file */
compressedFileUri: string;
};
}
export interface StartRecordingResult {
/** URI to the file being recorded */
fileUri: string;
/** MIME type of the recording */
mimeType: string;
/** Number of audio channels (1 for mono, 2 for stereo) */
channels?: number;
/** Bit depth of the audio (8, 16, or 32 bits) */
bitDepth?: BitDepth;
/** Sample rate of the audio in Hz */
sampleRate?: SampleRate;
/** Information about compression if enabled, including the URI to the compressed file */
compression?: CompressionInfo & {
/** URI to the compressed audio file */
compressedFileUri: string;
};
}
export interface AudioSessionConfig {
/**
* Audio session category that defines the audio behavior
* - 'Ambient': Audio continues with silent switch, mixes with other audio
* - 'SoloAmbient': Audio continues with silent switch, interrupts other audio
* - 'Playback': Audio continues in background, interrupts other audio
* - 'Record': Optimized for recording, interrupts other audio
* - 'PlayAndRecord': Allows simultaneous playback and recording
* - 'MultiRoute': Routes audio to multiple outputs simultaneously
*/
category?: 'Ambient' | 'SoloAmbient' | 'Playback' | 'Record' | 'PlayAndRecord' | 'MultiRoute';
/**
* Audio session mode that defines the behavior for specific use cases
* - 'Default': Standard audio behavior
* - 'VoiceChat': Optimized for voice chat applications
* - 'VideoChat': Optimized for video chat applications
* - 'GameChat': Optimized for in-game chat
* - 'VideoRecording': Optimized for video recording
* - 'Measurement': Optimized for audio measurement
* - 'MoviePlayback': Optimized for movie playback
* - 'SpokenAudio': Optimized for spoken audio content
*/
mode?: 'Default' | 'VoiceChat' | 'VideoChat' | 'GameChat' | 'VideoRecording' | 'Measurement' | 'MoviePlayback' | 'SpokenAudio';
/**
* Options that modify the behavior of the audio session category
* - 'MixWithOthers': Allows mixing with other active audio sessions
* - 'DuckOthers': Reduces the volume of other audio sessions
* - 'InterruptSpokenAudioAndMixWithOthers': Interrupts spoken audio and mixes with others
* - 'AllowBluetooth': Allows audio routing to Bluetooth devices
* - 'AllowBluetoothA2DP': Allows audio routing to Bluetooth A2DP devices
* - 'AllowAirPlay': Allows audio routing to AirPlay devices
* - 'DefaultToSpeaker': Routes audio to the speaker by default
*/
categoryOptions?: ('MixWithOthers' | 'DuckOthers' | 'InterruptSpokenAudioAndMixWithOthers' | 'AllowBluetooth' | 'AllowBluetoothA2DP' | 'AllowAirPlay' | 'DefaultToSpeaker')[];
}
export interface IOSConfig {
/** Configuration for the iOS audio session */
audioSession?: AudioSessionConfig;
}
export type RecordingInterruptionReason =
/** Audio focus was lost to another app */
'audioFocusLoss'
/** Audio focus was regained */
| 'audioFocusGain'
/** Recording was interrupted by a phone call */
| 'phoneCall'
/** Phone call that interrupted recording has ended */
| 'phoneCallEnded'
/** Recording was stopped by the system or another app */
| 'recordingStopped';
export interface RecordingInterruptionEvent {
/** The reason for the recording interruption */
reason: RecordingInterruptionReason;
/** Indicates whether the recording is paused due to the interruption */
isPaused: boolean;
}
export interface RecordingConfig {
/** Sample rate for recording in Hz (16000, 44100, or 48000) */
sampleRate?: SampleRate;
/** Number of audio channels (1 for mono, 2 for stereo) */
channels?: 1 | 2;
/** Encoding type for the recording (pcm_32bit, pcm_16bit, pcm_8bit) */
encoding?: EncodingType;
/** Interval in milliseconds at which to emit recording data */
interval?: number;
/** Interval in milliseconds at which to emit analysis data */
intervalAnalysis?: number;
/** Keep the device awake while recording (default is false) */
keepAwake?: boolean;
/** Show a notification during recording (default is false) */
showNotification?: boolean;
/** Show waveform in the notification (Android only, when showNotification is true) */
showWaveformInNotification?: boolean;
/** Configuration for the notification */
notification?: NotificationConfig;
/** Enable audio processing (default is false) */
enableProcessing?: boolean;
/** iOS-specific configuration */
ios?: IOSConfig;
/** Duration of each segment in milliseconds for analysis (default: 100) */
segmentDurationMs?: number;
/** Feature options to extract during audio processing */
features?: AudioFeaturesOptions;
/** Callback function to handle audio stream data */
onAudioStream?: (_: AudioDataEvent) => Promise<void>;
/** Callback function to handle audio features extraction results */
onAudioAnalysis?: (_: AudioAnalysisEvent) => Promise<void>;
/** Configuration for audio compression */
compression?: {
/** Enable audio compression */
enabled: boolean;
/** Format for compression (aac or opus) */
format: 'aac' | 'opus';
/** Bitrate for compression in bits per second */
bitrate?: number;
};
/** Whether to automatically resume recording after an interruption (default is false) */
autoResumeAfterInterruption?: boolean;
/** Optional callback to handle recording interruptions */
onRecordingInterrupted?: (_: RecordingInterruptionEvent) => void;
/** Optional directory path where output files will be saved */
outputDirectory?: string;
/** Optional filename for the recording (uses UUID if not provided) */
filename?: string;
}
export interface NotificationConfig {
/** Title of the notification */
title?: string;
/** Main text content of the notification */
text?: string;
/** Icon to be displayed in the notification (resource name or URI) */
icon?: string;
/** Android-specific notification configuration */
android?: {
/** Unique identifier for the notification channel */
channelId?: string;
/** User-visible name of the notification channel */
channelName?: string;
/** User-visible description of the notification channel */
channelDescription?: string;
/** Unique identifier for this notification */
notificationId?: number;
/** List of actions that can be performed from the notification */
actions?: NotificationAction[];
/** Configuration for the waveform visualization in the notification */
waveform?: WaveformConfig;
/** Color of the notification LED (if device supports it) */
lightColor?: string;
/** Priority of the notification (affects how it's displayed) */
priority?: 'min' | 'low' | 'default' | 'high' | 'max';
/** Accent color for the notification (used for the app icon and buttons) */
accentColor?: string;
};
/** iOS-specific notification configuration */
ios?: {
/** Identifier for the notification category (used for grouping similar notifications) */
categoryIdentifier?: string;
};
}
export interface NotificationAction {
/** Display title for the action */
title: string;
/** Unique identifier for the action */
identifier: string;
/** Icon to be displayed for the action (Android only) */
icon?: string;
}
export interface WaveformConfig {
/** The color of the waveform (e.g., "#FFFFFF" for white) */
color?: string;
/** Opacity of the waveform (0.0 - 1.0) */
opacity?: number;
/** Width of the waveform line (default: 1.5) */
strokeWidth?: number;
/** Drawing style: "stroke" for outline, "fill" for solid */
style?: 'stroke' | 'fill';
/** Whether to mirror the waveform (symmetrical display) */
mirror?: boolean;
/** Height of the waveform view in dp (default: 64) */
height?: number;
}
export interface ExtractAudioDataOptions {
/** URI of the audio file to extract data from */
fileUri: string;
/** Start time in milliseconds (for time-based range) */
startTimeMs?: number;
/** End time in milliseconds (for time-based range) */
endTimeMs?: number;
/** Start position in bytes (for byte-based range) */
position?: number;
/** Length in bytes to extract (for byte-based range) */
length?: number;
/** Include normalized audio data in [-1, 1] range */
includeNormalizedData?: boolean;
/** Include base64 encoded string representation of the audio data */
includeBase64Data?: boolean;
/** Include WAV header in the PCM data (makes it a valid WAV file) */
includeWavHeader?: boolean;
/** Logger for debugging - can pass console directly. */
logger?: ConsoleLike;
/** Compute the checksum of the PCM data */
computeChecksum?: boolean;
/** Target config for the normalized audio (Android and Web) */
decodingOptions?: DecodingConfig;
}
export interface ExtractedAudioData {
/** Raw PCM audio data */
pcmData: Uint8Array;
/** Normalized audio data in [-1, 1] range (when includeNormalizedData is true) */
normalizedData?: Float32Array;
/** Base64 encoded string representation of the audio data (when includeBase64Data is true) */
base64Data?: string;
/** Sample rate in Hz (e.g., 44100, 48000) */
sampleRate: number;
/** Number of audio channels (1 for mono, 2 for stereo) */
channels: number;
/** Bits per sample (8, 16, or 32) */
bitDepth: BitDepth;
/** Duration of the audio in milliseconds */
durationMs: number;
/** PCM format identifier (e.g., "pcm_16bit") */
format: PCMFormat;
/** Total number of audio samples per channel */
samples: number;
/** Whether the pcmData includes a WAV header */
hasWavHeader?: boolean;
/** CRC32 Checksum of PCM data */
checksum?: number;
}
export interface UseAudioRecorderState {
/** Starts recording with the specified configuration */
startRecording: (_: RecordingConfig) => Promise<StartRecordingResult>;
/** Stops the current recording and returns the recording data */
stopRecording: () => Promise<AudioRecording | null>;
/** Pauses the current recording */
pauseRecording: () => Promise<void>;
/** Resumes a paused recording */
resumeRecording: () => Promise<void>;
/** Indicates whether recording is currently active */
isRecording: boolean;
/** Indicates whether recording is in a paused state */
isPaused: boolean;
/** Duration of the current recording in milliseconds */
durationMs: number;
/** Size of the recorded audio in bytes */
size: number;
/** Information about compression if enabled */
compression?: CompressionInfo;
/** Analysis data for the recording if processing was enabled */
analysisData?: AudioAnalysis;
/** Optional callback to handle recording interruptions */
onRecordingInterrupted?: (_: RecordingInterruptionEvent) => void;
}
/**
* Represents an event emitted during the trimming process to report progress.
*/
export interface TrimProgressEvent {
/**
* The percentage of the trimming process that has been completed, ranging from 0 to 100.
*/
progress: number;
/**
* The number of bytes that have been processed so far. This is optional and may not be provided in all implementations.
*/
bytesProcessed?: number;
/**
* The total number of bytes to process. This is optional and may not be provided in all implementations.
*/
totalBytes?: number;
}
/**
* Defines a time range in milliseconds for trimming operations.
*/
export interface TimeRange {
/**
* The start time of the range in milliseconds.
*/
startTimeMs: number;
/**
* The end time of the range in milliseconds.
*/
endTimeMs: number;
}
/**
* Options for configuring the audio trimming operation.
*/
export interface TrimAudioOptions {
/**
* The URI of the audio file to trim.
*/
fileUri: string;
/**
* The mode of trimming to apply.
* - `'single'`: Trims the audio to a single range defined by `startTimeMs` and `endTimeMs`.
* - `'keep'`: Keeps the specified `ranges` and removes all other portions of the audio.
* - `'remove'`: Removes the specified `ranges` and keeps the remaining portions of the audio.
* @default 'single'
*/
mode?: 'single' | 'keep' | 'remove';
/**
* An array of time ranges to keep or remove, depending on the `mode`.
* - Required for `'keep'` and `'remove'` modes.
* - Ignored when `mode` is `'single'`.
*/
ranges?: TimeRange[];
/**
* The start time in milliseconds for the `'single'` mode.
* - If not provided, trimming starts from the beginning of the audio (0 ms).
*/
startTimeMs?: number;
/**
* The end time in milliseconds for the `'single'` mode.
* - If not provided, trimming extends to the end of the audio.
*/
endTimeMs?: number;
/**
* The name of the output file. If not provided, a default name will be generated.
*/
outputFileName?: string;
/**
* Configuration for the output audio format.
*/
outputFormat?: {
/**
* The format of the output audio file.
* - `'wav'`: Waveform Audio File Format (uncompressed).
* - `'aac'`: Advanced Audio Coding (compressed). Not supported on web platforms.
* - `'opus'`: Opus Interactive Audio Codec (compressed).
*/
format: 'wav' | 'aac' | 'opus';
/**
* The sample rate of the output audio in Hertz (Hz).
* - If not provided, the input audio's sample rate is used.
*/
sampleRate?: number;
/**
* The number of channels in the output audio (e.g., 1 for mono, 2 for stereo).
* - If not provided, the input audio's channel count is used.
*/
channels?: number;
/**
* The bit depth of the output audio, applicable to PCM formats like `'wav'`.
* - If not provided, the input audio's bit depth is used.
*/
bitDepth?: number;
/**
* The bitrate of the output audio in bits per second, applicable to compressed formats like `'aac'`.
* - If not provided, a default bitrate is used based on the format.
*/
bitrate?: number;
};
/**
* Options for decoding the input audio file.
* - See `DecodingConfig` for details.
*/
decodingOptions?: DecodingConfig;
}
/**
* Result of the audio trimming operation.
*/
export interface TrimAudioResult {
/**
* The URI of the trimmed audio file.
*/
uri: string;
/**
* The filename of the trimmed audio file.
*/
filename: string;
/**
* The duration of the trimmed audio in milliseconds.
*/
durationMs: number;
/**
* The size of the trimmed audio file in bytes.
*/
size: number;
/**
* The sample rate of the trimmed audio in Hertz (Hz).
*/
sampleRate: number;
/**
* The number of channels in the trimmed audio (e.g., 1 for mono, 2 for stereo).
*/
channels: number;
/**
* The bit depth of the trimmed audio, applicable to PCM formats like `'wav'`.
*/
bitDepth: number;
/**
* The MIME type of the trimmed audio file (e.g., `'audio/wav'`, `'audio/mpeg'`).
*/
mimeType: string;
/**
* Information about compression if the output format is compressed.
*/
compression?: {
/**
* The format of the compression (e.g., `'aac'`, `'mp3'`, `'opus'`).
*/
format: string;
/**
* The bitrate of the compressed audio in bits per second.
*/
bitrate: number;
/**
* The size of the compressed audio file in bytes.
*/
size: number;
};
/**
* Information about the processing time.
*/
processingInfo?: {
/**
* The time it took to process the audio in milliseconds.
*/
durationMs: number;
};
}
//# sourceMappingURL=ExpoAudioStream.types.d.ts.map