transcribe static method

Future<String> transcribe(
  1. Uint8List audioData
)

Transcribe audio data to text.

audioData - Raw audio bytes (PCM16 at 16kHz mono expected).

Returns the transcribed text.

Example:

final text = await RunAnywhere.transcribe(audioBytes);

Matches Swift: RunAnywhere.transcribe(_:)

Implementation

static Future<String> transcribe(Uint8List audioData) async {
  if (!_isInitialized) {
    throw SDKError.notInitialized();
  }

  if (!DartBridge.stt.isLoaded) {
    throw SDKError.sttNotAvailable(
      'No STT model loaded. Call loadSTTModel() first.',
    );
  }

  final logger = SDKLogger('RunAnywhere.Transcribe');
  logger.debug('Transcribing ${audioData.length} bytes of audio...');
  final startTime = DateTime.now().millisecondsSinceEpoch;
  final modelId = currentSTTModelId ?? 'unknown';

  // Get model name for telemetry
  final modelInfo =
      await DartBridgeModelRegistry.instance.getPublicModel(modelId);
  final modelName = modelInfo?.name;

  // Calculate audio duration from bytes (PCM16 at 16kHz mono)
  // Duration = bytes / 2 (16-bit = 2 bytes) / 16000 Hz * 1000 ms
  final calculatedDurationMs = (audioData.length / 32).round();

  try {
    final result = await DartBridge.stt.transcribe(audioData);
    final latencyMs = DateTime.now().millisecondsSinceEpoch - startTime;

    // Use calculated duration if C++ returns 0
    final audioDurationMs =
        result.durationMs > 0 ? result.durationMs : calculatedDurationMs;

    // Count words in transcription
    final wordCount = result.text.trim().isEmpty
        ? 0
        : result.text.trim().split(RegExp(r'\s+')).length;

    // Track transcription success with full metrics
    TelemetryService.shared.trackTranscription(
      modelId: modelId,
      modelName: modelName,
      audioDurationMs: audioDurationMs,
      latencyMs: latencyMs,
      wordCount: wordCount,
      confidence: result.confidence,
      language: result.language,
      isStreaming: false, // Batch transcription
    );

    logger.info(
        'Transcription complete: ${result.text.length} chars, confidence: ${result.confidence}');
    return result.text;
  } catch (e) {
    // Track transcription failure
    TelemetryService.shared.trackError(
      errorCode: 'transcription_failed',
      errorMessage: e.toString(),
      context: {'model_id': modelId},
    );

    logger.error('Transcription failed: $e');
    rethrow;
  }
}