babai/backend/routes/translate/index.dart
2025-01-29 17:50:44 -07:00

96 lines
2.7 KiB
Dart

import 'dart:io';
import 'dart:math';
import 'package:backend/extensions/request_context.dart';
import 'package:backend/store.dart';
import 'package:dart_frog/dart_frog.dart';
import 'package:shared_models/models/translation_request.dart';
import 'package:shared_models/models/translation_response.dart';
import 'package:uuid/uuid.dart';
Future<Response> onRequest(RequestContext context) async {
if (context.request.method != HttpMethod.post) {
return Response(statusCode: HttpStatus.methodNotAllowed);
}
try {
final userId = context.userId;
final body = await context.request.json() as Map<String, dynamic>;
final inputText = body['text'] as String?;
if (inputText == null) {
return Response.json(
statusCode: HttpStatus.badRequest,
body: {'error': 'text field is required'},
);
}
final id = const Uuid().v4();
final translation = TranslationRequest(
id: id,
inputText: inputText,
timestamp: DateTime.now(),
result: generateBabyTalk(inputText),
userId: userId, // Replace with actual translation logic
);
MemoryStore.addHumanTranslation(translation);
return Response.json(
body: TranslationResponse(
id: id,
translatedText: translation.result!,
).toJson(),
);
} catch (e) {
return Response.json(
statusCode: HttpStatus.internalServerError,
body: {'error': e.toString()},
);
}
}
String generateBabyTalk(String input) {
final random = Random(input.hashCode);
final syllables = ['goo', 'ga', 'bah', 'ma', 'da', 'ba'];
final sounds = ['ah', 'oh', 'eh'];
// Roughly calculate how many syllables we want based on input length
final targetLength = (input.length / 2).round();
// Add some randomness to the target length (±30%)
final variance = (targetLength * 0.3).round();
final finalLength = targetLength + random.nextInt(variance * 2) - variance;
final List<String> result = [];
// Sometimes start with a sound
if (random.nextBool()) {
result.add(sounds[random.nextInt(sounds.length)]);
}
while (result.join(' ').length < input.length) {
// Randomly decide to repeat the last syllable
if (result.isNotEmpty && random.nextDouble() < 0.3) {
result.add(result.last);
continue;
}
// Randomly combine syllables
if (random.nextDouble() < 0.4) {
final syl1 = syllables[random.nextInt(syllables.length)];
final syl2 = syllables[random.nextInt(syllables.length)];
result.add('$syl1 $syl2');
} else {
result.add(syllables[random.nextInt(syllables.length)]);
}
// Sometimes add a sound between syllables
if (random.nextDouble() < 0.2) {
result.add(sounds[random.nextInt(sounds.length)]);
}
}
return result.join(' ');
}