70 lines
2 KiB
TypeScript
70 lines
2 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import nlp from 'compromise';
|
|
|
|
const MAX_BLOCK_LENGTH = 450;
|
|
|
|
const preprocessSentenceForAudio = (text: string): string => {
|
|
return text
|
|
.replace(/\S*(?:https?:\/\/|www\.)([^\/\s]+)(?:\/\S*)?/gi, '- (link to $1) -')
|
|
.replace(/(\w+)-\s+(\w+)/g, '$1$2') // Remove hyphenation
|
|
// Remove special character *
|
|
.replace(/\*/g, '')
|
|
.replace(/\s+/g, ' ')
|
|
.trim();
|
|
};
|
|
|
|
const splitIntoSentences = (text: string): string[] => {
|
|
const paragraphs = text.split(/\n+/);
|
|
const blocks: string[] = [];
|
|
|
|
for (const paragraph of paragraphs) {
|
|
if (!paragraph.trim()) continue;
|
|
|
|
const cleanedText = preprocessSentenceForAudio(paragraph);
|
|
const doc = nlp(cleanedText);
|
|
const rawSentences = doc.sentences().out('array') as string[];
|
|
|
|
let currentBlock = '';
|
|
|
|
for (const sentence of rawSentences) {
|
|
const trimmedSentence = sentence.trim();
|
|
|
|
if (currentBlock && (currentBlock.length + trimmedSentence.length + 1) > MAX_BLOCK_LENGTH) {
|
|
blocks.push(currentBlock.trim());
|
|
currentBlock = trimmedSentence;
|
|
} else {
|
|
currentBlock = currentBlock
|
|
? `${currentBlock} ${trimmedSentence}`
|
|
: trimmedSentence;
|
|
}
|
|
}
|
|
|
|
if (currentBlock) {
|
|
blocks.push(currentBlock.trim());
|
|
}
|
|
}
|
|
|
|
return blocks;
|
|
};
|
|
|
|
export async function POST(req: NextRequest) {
|
|
try {
|
|
const { text } = await req.json();
|
|
if (!text) {
|
|
return NextResponse.json({ error: 'No text provided' }, { status: 400 });
|
|
}
|
|
|
|
if (text.length <= MAX_BLOCK_LENGTH) {
|
|
// Single sentence preprocessing
|
|
const cleanedText = preprocessSentenceForAudio(text);
|
|
return NextResponse.json({ sentences: [cleanedText] });
|
|
}
|
|
|
|
// Full text splitting into sentences
|
|
const sentences = splitIntoSentences(text);
|
|
return NextResponse.json({ sentences });
|
|
} catch (error) {
|
|
console.error('Error processing text:', error);
|
|
return NextResponse.json({ error: 'Failed to process text' }, { status: 500 });
|
|
}
|
|
}
|