96 lines
2.7 KiB
Dart
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(' ');
|
|
}
|