Babies are free
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
import 'dart:io';
|
||||
import 'package:backend/extensions/request_context.dart';
|
||||
import 'package:backend/store.dart';
|
||||
import 'package:dart_frog/dart_frog.dart';
|
||||
|
||||
Response onRequest(RequestContext context, String id) {
|
||||
if (context.request.method != HttpMethod.get) {
|
||||
return Response(statusCode: HttpStatus.methodNotAllowed);
|
||||
}
|
||||
|
||||
final userId = context.userId;
|
||||
|
||||
final translation = MemoryStore.getHumanTranslation(id, userId);
|
||||
if (translation == null) {
|
||||
return Response.json(
|
||||
statusCode: HttpStatus.notFound,
|
||||
body: {'error': 'Translation not found'},
|
||||
);
|
||||
}
|
||||
|
||||
return Response.json(body: translation.toJson());
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
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(' ');
|
||||
}
|
||||
Reference in New Issue
Block a user