mirror of
https://github.com/lucasrcsantana/story-generator.git
synced 2025-12-17 13:57:51 +00:00
151 lines
3.6 KiB
Markdown
151 lines
3.6 KiB
Markdown
# Sistema de Gravação de Áudio
|
|
|
|
## Visão Geral
|
|
O sistema de gravação de áudio permite aos alunos gravar suas leituras para análise posterior, com integração ao Modo Foco e recursos de acessibilidade.
|
|
|
|
## Componentes
|
|
|
|
### 1. AudioRecorder
|
|
Componente principal responsável pela gravação de áudio.
|
|
|
|
#### Props
|
|
```typescript
|
|
interface AudioRecorderProps {
|
|
storyId: string;
|
|
studentId: string;
|
|
onAudioUploaded: (audioUrl: string) => void;
|
|
onRecordingStart?: () => void;
|
|
onRecordingStop?: () => void;
|
|
focusModeActive?: boolean;
|
|
onFocusModeToggle?: () => void;
|
|
}
|
|
```
|
|
|
|
### 2. Estados de Gravação
|
|
- **Não Iniciado**: Exibe botão "Iniciar Gravação"
|
|
- **Gravando**: Exibe botão "Parar Gravação"
|
|
- **Gravado**: Exibe opções de ouvir e enviar
|
|
- **Enviando**: Exibe indicador de progresso
|
|
|
|
## Funcionalidades
|
|
|
|
### 1. Controle de Gravação
|
|
- Início/parada de gravação
|
|
- Feedback visual do estado atual
|
|
- Integração com Modo Foco
|
|
- Controle de permissões do microfone
|
|
|
|
### 2. Processamento de Áudio
|
|
- Formato: WebM
|
|
- Armazenamento temporário em Blob
|
|
- Conversão e compressão antes do upload
|
|
- Validação de qualidade
|
|
|
|
### 3. Upload e Armazenamento
|
|
- Upload para Supabase Storage
|
|
- Geração de URLs públicas
|
|
- Organização por aluno/história
|
|
- Backup e cache
|
|
|
|
### 4. Integração com Modo Foco
|
|
- Ativação automática do Modo Foco
|
|
- Desativação ao finalizar gravação
|
|
- Sincronização de estados
|
|
- Transições suaves
|
|
|
|
## Fluxo de Gravação
|
|
|
|
### 1. Início da Gravação
|
|
```typescript
|
|
const startRecording = async () => {
|
|
// 1. Ativar Modo Foco
|
|
if (!focusModeActive && onFocusModeToggle) {
|
|
onFocusModeToggle();
|
|
}
|
|
|
|
// 2. Solicitar permissões
|
|
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
|
|
|
// 3. Configurar gravador
|
|
mediaRecorderRef.current = new MediaRecorder(stream);
|
|
|
|
// 4. Iniciar gravação
|
|
mediaRecorderRef.current.start();
|
|
};
|
|
```
|
|
|
|
### 2. Finalização da Gravação
|
|
```typescript
|
|
const stopRecording = () => {
|
|
// 1. Parar gravação
|
|
mediaRecorderRef.current?.stop();
|
|
|
|
// 2. Liberar recursos
|
|
mediaRecorderRef.current?.stream.getTracks().forEach(track => track.stop());
|
|
|
|
// 3. Desativar Modo Foco
|
|
if (focusModeActive && onFocusModeToggle) {
|
|
onFocusModeToggle();
|
|
}
|
|
};
|
|
```
|
|
|
|
### 3. Upload do Áudio
|
|
```typescript
|
|
const uploadAudio = async () => {
|
|
// 1. Preparar arquivo
|
|
const filePath = `${studentId}/${storyId}/${fileId}.webm`;
|
|
|
|
// 2. Fazer upload
|
|
await supabase.storage
|
|
.from('recordings')
|
|
.upload(filePath, audioBlob);
|
|
|
|
// 3. Obter URL pública
|
|
const { publicUrl } = supabase.storage
|
|
.from('recordings')
|
|
.getPublicUrl(filePath);
|
|
|
|
// 4. Criar registro
|
|
await supabase
|
|
.from('story_recordings')
|
|
.insert({
|
|
id: fileId,
|
|
story_id: storyId,
|
|
student_id: studentId,
|
|
audio_url: publicUrl
|
|
});
|
|
};
|
|
```
|
|
|
|
## Tratamento de Erros
|
|
|
|
### 1. Permissões
|
|
- Verificação de disponibilidade do microfone
|
|
- Solicitação de permissões do usuário
|
|
- Feedback claro em caso de negação
|
|
|
|
### 2. Gravação
|
|
- Monitoramento de qualidade
|
|
- Detecção de silêncio
|
|
- Limite de duração
|
|
- Feedback de volume
|
|
|
|
### 3. Upload
|
|
- Retry em caso de falha
|
|
- Limpeza de arquivos temporários
|
|
- Validação de formato
|
|
- Feedback de progresso
|
|
|
|
## Considerações de Segurança
|
|
- Validação de tipos de arquivo
|
|
- Sanitização de nomes de arquivo
|
|
- Controle de acesso por usuário
|
|
- Expiração de URLs temporárias
|
|
|
|
## Próximas Melhorias
|
|
1. Adicionar visualização de forma de onda
|
|
2. Implementar edição básica de áudio
|
|
3. Melhorar feedback de qualidade
|
|
4. Adicionar suporte a mais formatos
|
|
5. Implementar detecção de ruído |