npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@albertasoft/promptica-speech-to-text

v1.0.42

Published

A comprehensive React library for speech recognition with authentication, encryption, and usage tracking

Readme

🎤 Promptica Speech-to-Text

A powerful, flexible, and easy-to-use React speech-to-text library from promptica.ca Features include real-time transcription, multiple language support, and both hook and component-based APIs.

🎯 Zero Configuration Required - Import and use anywhere in your React app. No HTML elements needed. Full flexibility! just signe up in promptica.ca and get a access token.

✨ Features

  • 🎯 Simple Hook API - Easy integration with useSpeechToText()
  • 🎨 Pre-built UI Component - Ready-to-use interface with controls
  • Real-time Transcription - Live interim and final results
  • 🌐 Global API - Access from anywhere via window.promptica.speechToText
  • 📱 TypeScript Support - Full type safety and IntelliSense
  • 🔧 Highly Configurable - Customize behavior and callbacks
  • 🎭 Browser Compatible - Works with Chrome, Edge, Safari
  • 🔐 Secure Authentication - Token-based API authentication with encryption
  • 📊 Usage Analytics - Automatic tracking with browser metadata collection
  • 🔒 Code Protection - Built with advanced obfuscation for security

📦 Installation

npm install promptica-speech-to-text
# or
pnpm install promptica-speech-to-text
# or
yarn add promptica-speech-to-text

Note: This is a library - no HTML elements are automatically created. You have full control over where and how to mount components. No <div id="..."> required!

🚀 Quick Start

Option 1: Using the Hook (Custom UI)

Perfect for when you want full control over the UI:

import { useSpeechToText } from 'promptica-speech-to-text';

function MyComponent() {
  const speechToText = useSpeechToText(
    { token: 'your-promptica-token' }, // Authentication
    {
      language: 'en-US',
      continuous: true,
      interimResults: true,
    }
  );

  return (
    <div>
      <button onClick={speechToText.start} disabled={!speechToText.ready}>
        Start Listening
      </button>
      <button onClick={speechToText.stop}>Stop</button>
      <p>Interim: {speechToText.interimTranscript}</p>
      <p>Final: {speechToText.finalTranscript}</p>
      {speechToText.error && <p>Error: {speechToText.error}</p>}
    </div>
  );
}

Option 2: Using the Pre-built UI Component

Use our styled component - just pass configuration:

import { useSpeechToText, SpeechToTextUI } from 'promptica-speech-to-text';

function App() {
  const speech = useSpeechToText({
    language: 'en-US',
    continuous: true,
    interimResults: true,
  });

  const handleTranscriptChange = (transcript: string) => {
    console.log('Current transcript:', transcript);
  };

  const handleFinalTranscript = (finalText: string) => {
    console.log('Final transcript:', finalText);
  };

  return (
    <SpeechToTextUI
      instance={speech}
      showUI={true} // Set to false for headless mode
      onTranscriptChange={handleTranscriptChange}
      onFinalTranscript={handleFinalTranscript}
      placeholder="Click the microphone to start speaking..."
    />
  );
}

Option 3: Headless Mode (No UI at all!)

Perfect for voice commands, accessibility features, or when you want console-only control:

import { useSpeechToText, globalSpeechAPI } from 'promptica-speech-to-text';
import { useEffect } from 'react';

function App() {
  const speech = useSpeechToText({
    language: 'en-US',
    continuous: true,
  });
  
  // Initialize global API for console control
  useEffect(() => {
    globalSpeechAPI.init(speech);
  }, [speech]);

  // Use speech.transcript programmatically
  useEffect(() => {
    if (speech.transcript.includes('hello')) {
      console.log('User said hello!');
    }
  }, [speech.transcript]);

  // No UI rendered - all control via code or console!
  return null;
}

Then control from anywhere (even browser console):

// See all available commands
window.promptica.speechToText.help();

// Check current status
window.promptica.speechToText.getInstanceStatus();

// Start listening
window.promptica.speechToText.start();

// Stop listening
window.promptica.speechToText.stop();

// Change language
window.promptica.speechToText.setLanguage('es-ES');

// Get transcript
const text = window.promptica.speechToText.getTranscript();

// Get available languages
const languages = window.promptica.speechToText.getAvailableLanguages();

// Check browser support
window.promptica.speechToText.checkBrowserSupport();

📖 API Reference

useSpeechToText(config?, callbacks?)

The main hook for speech recognition.

Parameters

config (optional): SpeechToTextConfig

{
  continuous?: boolean;        // Keep listening (default: true)
  interimResults?: boolean;    // Show interim results (default: true)
  language?: string;           // Language code (default: 'en-US')
  maxAlternatives?: number;    // Max alternatives (default: 1)
  grammars?: SpeechGrammarList; // Speech grammars
}

callbacks (optional): SpeechToTextCallbacks

{
  onStart?: () => void;
  onEnd?: () => void;
  onResult?: (result: SpeechToTextResult) => void;
  onError?: (error: SpeechRecognitionErrorEvent) => void;
  onNoMatch?: () => void;
  onSoundStart?: () => void;
  onSoundEnd?: () => void;
  onSpeechStart?: () => void;
  onSpeechEnd?: () => void;
  onAudioStart?: () => void;
  onAudioEnd?: () => void;
}

Returns: SpeechToTextInstance

{
  start: () => void;                    // Start listening
  stop: () => void;                     // Stop listening
  abort: () => void;                    // Abort recognition
  isListening: boolean;                 // Current listening state
  isSupported: boolean;                 // Browser support check
  transcript: string;                   // Full transcript
  interimTranscript: string;            // Current interim text
  finalTranscript: string;              // All final text
  error: string | null;                 // Last error message
  setConfig: (config) => void;          // Update configuration
  setCallbacks: (callbacks) => void;    // Update callbacks
  clearTranscript: () => void;          // Clear all text
  getLanguages: () => string[];         // Get available languages
}

🎯 Usage Examples

Important: No HTML elements are required! Just import and use. The library gives you full control.

Example 1: Basic Transcription

import { useSpeechToText } from 'promptica-speech-to-text';

function BasicTranscription() {
  const { start, stop, transcript, isListening } = useSpeechToText();

  return (
    <div>
      <button onClick={isListening ? stop : start}>
        {isListening ? 'Stop' : 'Start'}
      </button>
      <p>{transcript}</p>
    </div>
  );
}

Example 2: With Custom Callbacks

import { useSpeechToText } from 'promptica-speech-to-text';

function CustomCallbacks() {
  const [results, setResults] = useState([]);

  const speechToText = useSpeechToText(
    { language: 'en-US', continuous: true },
    {
      onResult: (result) => {
        if (result.isFinal) {
          setResults(prev => [...prev, result.transcript]);
          console.log(`Confidence: ${result.confidence}`);
        }
      },
      onError: (error) => {
        console.error('Speech recognition error:', error);
      },
      onStart: () => console.log('Started listening'),
      onEnd: () => console.log('Stopped listening'),
    }
  );

  return (
    <div>
      <button onClick={speechToText.start}>Start</button>
      <button onClick={speechToText.stop}>Stop</button>
      <ul>
        {results.map((text, i) => (
          <li key={i}>{text}</li>
        ))}
      </ul>
    </div>
  );
}

Example 3: Multi-language Support

import { useSpeechToText } from 'promptica-speech-to-text';

function MultiLanguage() {
  const speechToText = useSpeechToText();
  const [language, setLanguage] = useState('en-US');

  const handleLanguageChange = (lang: string) => {
    setLanguage(lang);
    speechToText.setConfig({ language: lang });
  };

  return (
    <div>
      <select value={language} onChange={(e) => handleLanguageChange(e.target.value)}>
        {speechToText.getLanguages().map(lang => (
          <option key={lang} value={lang}>{lang}</option>
        ))}
      </select>
      <button onClick={speechToText.start}>Start</button>
      <button onClick={speechToText.stop}>Stop</button>
      <p>{speechToText.transcript}</p>
    </div>
  );
}

Example 4: Imperative Handle with Ref

import { forwardRef, useImperativeHandle, useRef } from 'react';
import { useSpeechToText, type SpeechToTextInstance } from 'promptica-speech-to-text';

export interface SpeechToTextRef extends SpeechToTextInstance {}

const SpeechToTextImperative = forwardRef<SpeechToTextRef>((_, ref) => {
  const speechToText = useSpeechToText();
  
  useImperativeHandle(ref, () => speechToText, [speechToText]);

  return (
    <div>
      <div>Status: {speechToText.isListening ? 'Listening' : 'Stopped'}</div>
      <div>Transcript: {speechToText.transcript}</div>
    </div>
  );
});

// Usage
function App() {
  const speechRef = useRef<SpeechToTextRef>(null);

  return (
    <div>
      <button onClick={() => speechRef.current?.start()}>Start</button>
      <button onClick={() => speechRef.current?.stop()}>Stop</button>
      <SpeechToTextImperative ref={speechRef} />
    </div>
  );
}

Example 5: With Form Integration

import { useSpeechToText } from 'promptica-speech-to-text';

function FormIntegration() {
  const [formData, setFormData] = useState({ message: '' });
  const speechToText = useSpeechToText({
    continuous: false,
    interimResults: false,
  });

  useEffect(() => {
    if (speechToText.finalTranscript) {
      setFormData(prev => ({
        ...prev,
        message: prev.message + ' ' + speechToText.finalTranscript,
      }));
      speechToText.clearTranscript();
    }
  }, [speechToText.finalTranscript]);

  return (
    <form>
      <textarea
        value={formData.message}
        onChange={(e) => setFormData({ message: e.target.value })}
        placeholder="Type or speak your message..."
      />
      <button type="button" onClick={speechToText.start}>
        🎤 Voice Input
      </button>
      <button type="submit">Send</button>
    </form>
  );
}

🌍 Supported Languages

  • en-US - English (United States)
  • en-GB - English (United Kingdom)
  • es-ES - Spanish (Spain)
  • fr-FR - French (France)
  • de-DE - German (Germany)
  • it-IT - Italian (Italy)
  • ja-JP - Japanese (Japan)
  • ko-KR - Korean (South Korea)
  • pt-BR - Portuguese (Brazil)
  • ru-RU - Russian (Russia)
  • zh-CN - Chinese (Simplified)
  • zh-TW - Chinese (Traditional)
  • ar-SA - Arabic (Saudi Arabia)
  • hi-IN - Hindi (India)
  • nl-NL - Dutch (Netherlands)
  • pl-PL - Polish (Poland)
  • tr-TR - Turkish (Turkey)
  • sv-SE - Swedish (Sweden)
  • da-DK - Danish (Denmark)
  • fi-FI - Finnish (Finland)

🔧 Configuration Options

SpeechToTextUI Props

interface SpeechToTextUIProps {
  onTranscriptChange?: (transcript: string) => void;
  onFinalTranscript?: (transcript: string) => void;
  showInterim?: boolean;           // Show interim results (default: true)
  className?: string;               // Custom container class
  buttonClassName?: string;         // Custom button class
  textareaClassName?: string;       // Custom textarea class
  language?: string;                // Initial language (default: 'en-US')
  continuous?: boolean;             // Continuous listening (default: true)
  placeholder?: string;             // Textarea placeholder
}

⚠️ Browser Support

The Web Speech API is supported in:

  • ✅ Chrome 25+
  • ✅ Edge 79+
  • ✅ Safari 14.1+
  • ❌ Firefox (not supported)

Check browser support:

const { isSupported } = useSpeechToText();

if (!isSupported) {
  return <div>Speech recognition is not supported in this browser.</div>;
}

🐛 Error Handling

const speechToText = useSpeechToText();

// Check for errors
if (speechToText.error) {
  // Common errors:
  // - "no-speech": No speech detected
  // - "audio-capture": Microphone not accessible
  // - "not-allowed": Permission denied
  // - "network": Network error
  console.error('Error:', speechToText.error);
}

📝 TypeScript Support

All components are fully typed. Import types:

import type {
  SpeechToTextConfig,
  SpeechToTextCallbacks,
  SpeechToTextInstance,
  SpeechToTextResult,
  SpeechToTextUIProps,
} from 'promptica-speech-to-text';

🔒 Permissions

The browser will request microphone permission on first use. Ensure your site is served over HTTPS in production.

🎭 Library vs Demo Mode

As a Library (Production)

When users install your library, no HTML elements are required:

// User's app - no HTML element needed!
import { useSpeechToText, SpeechToTextUI } from 'promptica-speech-to-text';

function UserApp() {
  const speech = useSpeechToText();
  
  // User mounts wherever they want
  return <SpeechToTextUI instance={speech} showUI={true} />;
}

Demo Mode (Development)

When running pnpm dev for testing, it automatically mounts to <div id="root"> which is already in index.html. This doesn't affect library users at all!

📖 See detailed explanation

📚 Advanced Usage

Custom Styling

The UI component accepts className props for custom styling:

<SpeechToTextUI
  className="my-container"
  buttonClassName="my-button"
  textareaClassName="my-textarea"
/>

Or use inline styles by modifying the styles object in speechToTextUi.tsx.

Dynamic Configuration

Update configuration on the fly:

const speechToText = useSpeechToText();

// Change language
speechToText.setConfig({ language: 'es-ES' });

// Enable continuous mode
speechToText.setConfig({ continuous: true });

// Multiple configs at once
speechToText.setConfig({
  language: 'fr-FR',
  continuous: false,
  interimResults: true,
});

🤝 Contributing

Contributions are welcome! Feel free to submit issues and pull requests.

📄 License

MIT License - feel free to use in your projects!

🙏 Acknowledgments

Built with React and the Web Speech API. Special thanks to the open-source community.


Made with ❤️ by Promptica