pipedog is an unofficial community port of Pipecat, not affiliated with Daily.
pipedog
Speech-to-text

Groq

Speech-to-text with GroqSTTService, Whisper models served by Groq.

Overview

  • GroqSTTService: a BaseWhisperSTTService subclass. Each utterance (segmented by VAD) is sent to Groq's OpenAI-compatible transcription endpoint, and the text comes back as a TranscriptionFrame.

Installation

bun add @pipedog/groq
import { GroqSTTService } from "@pipedog/groq/stt";

Prerequisites

  • A Groq account and an API key from the Groq console.
  • Pass the key as apiKey. It is required, and the service never falls back to OPENAI_API_KEY. The examples read it from GROQ_API_KEY.
  • A VAD in the pipeline, since this is a segmented service: it transcribes each utterance once the user stops speaking.

GroqSTTService

Base URL https://api.groq.com/openai/v1.

Configuration

Prop

Type

Settings

Runtime-updatable settings, passed as settings: new GroqSTTService.Settings({...}) (GroqSTTSettings). Any setting you leave out keeps the default below.

SettingTypeDefaultDescription
modelstring"whisper-large-v3-turbo"Whisper model.
languageLanguage | nullLanguage.ENLanguage of the audio.
promptstring | nullnullText to guide the style, or to continue a previous segment.
temperaturenumber | nullnullSampling temperature, 0 to 1.

Usage

stt.ts
import { STTUpdateSettingsFrame } from "@pipedog/core/frames/frames";
import { GroqSTTService } from "@pipedog/groq/stt";

const stt = new GroqSTTService({
  apiKey: process.env.GROQ_API_KEY ?? "",
  settings: new GroqSTTService.Settings({ model: "whisper-large-v3-turbo" }),
});

Change settings mid-call with an STTUpdateSettingsFrame:

// Queue it on the worker, or push it from a processor upstream of the service.
const update = new STTUpdateSettingsFrame({
  delta: new GroqSTTService.Settings({ prompt: "Pipecat, pipedog" }),
});

Notes

  • Uploads each utterance as a WAV file, with response_format: "json" ("verbose_json" when includeProbMetrics is on, for per-segment probabilities).
  • httpClient replaces the SDK's fetch, for example to set a longer request timeout.
  • pushEmptyTranscripts pushes empty transcriptions instead of dropping them.

Runtime notes

RuntimeWorksWhat it needs
Bun✅ yesNothing.
Node.js✅ yesNothing.
Deno✅ yesNothing.
Cloudflare Workers✅ yesNothing.

Generated from pipecat.runtimes and pipecat.compat in packages/groq/package.json: ✅ means the compat smoke test passes on that runtime.

  • The client is the openai JS SDK (through @pipedog/whisper) over fetch. It works on Bun, Node, Deno and Cloudflare Workers.
  • The deprecated model, language, prompt and temperature constructor options are not ported. Use settings.
  • Tested against fakes, not against Groq itself.

pipedog is an unofficial community TypeScript port of Pipecat. It is not affiliated with or endorsed by Daily or the Pipecat project.

Portions adapted from the Pipecat documentation, Copyright (c) 2024–2025 Daily, BSD-2-Clause (see apps/docs/LICENSE-pipecat-docs).

On this page