Call Transcript Kit

Call Transcript Kit is a pure Dart library designed for parsing, segmenting, and analyzing call transcripts. It parses raw verbose JSON responses from OpenAI Whisper into structured speaker turns by silence gaps. The package also extracts actionable follow-ups and calculates spam likelihood scores for incoming calls without relying on Flutter.

Installation

Add this package to your pubspec.yaml under dependencies:

dependencies:
  call_transcript_kit:
    path: ./package

Then run:

dart pub get

Usage

Here are usage examples for each class provided by the package.

1. SpeakerSegment

Represents a single segment of a call transcript spoken by a specific speaker.

import 'package:call_transcript_kit/call_transcript_kit.dart';

void main() {
  final segment = SpeakerSegment(
    speakerLabel: 'Caller',
    text: 'Hello, I need to cancel my subscription.',
    startMs: 1200,
    endMs: 4500,
    sentiment: 'negative',
  );

  // Convert to JSON
  final jsonMap = segment.toJson();
  print(jsonMap);

  // Parse from JSON
  final parsed = SpeakerSegment.fromJson(jsonMap);
  print(parsed.text);
}

2. TranscriptParser

Groups words from Whisper's verbose JSON response into segments with silence gaps of more than 1.5 seconds, alternating speaker labels.

import 'package:call_transcript_kit/call_transcript_kit.dart';

void main() {
  final parser = TranscriptParser();
  final whisperJson = {
    'words': [
      {'word': 'Hello', 'start': 0.5, 'end': 0.9},
      {'word': 'there', 'start': 1.0, 'end': 1.4},
      {'word': 'Hi', 'start': 3.2, 'end': 3.5},
    ]
  };

  final List<SpeakerSegment> segments = parser.parseWhisperResponse(whisperJson);
  for (final segment in segments) {
    print('${segment.speakerLabel}: ${segment.text} (${segment.startMs}ms - ${segment.endMs}ms)');
  }
}

3. SentimentAnalyzer

Performs basic keyword matching to classify the sentiment of a text into positive, neutral, or negative.

import 'package:call_transcript_kit/call_transcript_kit.dart';

void main() {
  const analyzer = SentimentAnalyzer();
  
  final sentiment1 = analyzer.analyze('That sounds perfect, thank you so much!');
  print(sentiment1); // Sentiment.positive

  final sentiment2 = analyzer.analyze('I have a problem and the wrong item was sent.');
  print(sentiment2); // Sentiment.negative
}

4. SpamClassifier

Scores the call's spam likelihood based on duration, contact name presence, and suspicious transcript keywords.

import 'package:call_transcript_kit/call_transcript_kit.dart';

void main() {
  const classifier = SpamClassifier();

  final score = classifier.score(null, 5, 'KYC verify suspended urgent');
  print('Spam Score: $score'); // 1.0

  final isSpamCall = classifier.isSpam(score);
  print('Is Spam: $isSpamCall'); // true
}

5. ActionItemExtractor

Scans transcript speaker segments and extracts sentences that match action-oriented regex patterns.

import 'package:call_transcript_kit/call_transcript_kit.dart';

void main() {
  const extractor = ActionItemExtractor();
  final segments = [
    SpeakerSegment(
      speakerLabel: 'You',
      text: 'I will send you the document tomorrow. Let me check the schedule.',
      startMs: 1000,
      endMs: 5000,
      sentiment: 'neutral',
    ),
  ];

  final actionItems = extractor.extract(segments);
  for (final item in actionItems) {
    print('Action Item: $item');
  }
}

API Reference Table

Class Purpose Main Method
SpeakerSegment Data class representing a speaker turn toJson() / SpeakerSegment.fromJson()
TranscriptParser Groups word-level timestamps into speaker segments parseWhisperResponse(json)
SentimentAnalyzer Computes sentiment (positive/neutral/negative) analyze(text)
SpamClassifier Evaluates the spam risk of a call score(contactName, durationSeconds, transcriptText)
ActionItemExtractor Identifies promises/tasks in transcript segments extract(segments)