Skip to content

Quick Start

This guide will walk you through building your first voice-enabled web application with Vowel.

Step 1: Install Vowel

bash
npm install @vowel.to/client

Step 2: Get Your App ID

  1. Visit vowel.to
  2. Create a free account
  3. Create a new app
  4. Copy your App ID

Step 3: Create a Vowel Client

Create a file to initialize your Vowel client:

typescript
// vowel.client.ts
import { Vowel, createDirectAdapters } from '@vowel.to/client';

// Define your routes
const routes = [
  { path: '/', description: 'Home page' },
  { path: '/products', description: 'Browse our products' },
  { path: '/cart', description: 'Shopping cart' },
  { path: '/checkout', description: 'Checkout' }
];

// Create adapters
const { navigationAdapter, automationAdapter } = createDirectAdapters({
  navigate: (path) => {
    // Replace with your router's navigate function
    window.location.href = path;
  },
  routes,
  enableAutomation: true
});

// Initialize Vowel
export const vowel = new Vowel({
  appId: 'your-app-id', // Replace with your actual App ID
  navigationAdapter,
  automationAdapter
});

Step 4: Start a Voice Session

typescript
// Start the voice session when user clicks a button
document.getElementById('start-voice')?.addEventListener('click', async () => {
  await vowel.startSession();
});

// Stop the session
document.getElementById('stop-voice')?.addEventListener('click', () => {
  vowel.stopSession();
});

Step 5: Register Custom Actions

Add business logic that the AI can execute:

typescript
// Register a search action
vowel.registerAction('searchProducts', {
  description: 'Search for products',
  parameters: {
    query: {
      type: 'string',
      description: 'Search query'
    }
  }
}, async ({ query }) => {
  // Your search logic
  const results = await fetch(`/api/products/search?q=${query}`);
  return {
    success: true,
    results: await results.json()
  };
});

// Register an add to cart action
vowel.registerAction('addToCart', {
  description: 'Add a product to the shopping cart',
  parameters: {
    productId: {
      type: 'string',
      description: 'Product ID'
    },
    quantity: {
      type: 'number',
      description: 'Quantity to add',
      optional: true
    }
  }
}, async ({ productId, quantity = 1 }) => {
  // Your add to cart logic
  await fetch('/api/cart/add', {
    method: 'POST',
    body: JSON.stringify({ productId, quantity })
  });
  
  return {
    success: true,
    message: `Added ${quantity} item(s) to cart`
  };
});

Step 6: Test Voice Commands

Start your voice session and try these commands:

  • "Navigate to products"
  • "Search for wireless headphones"
  • "Add product 123 to cart"
  • "Go to checkout"

React Integration

If you're using React, here's a complete example:

tsx
// App.tsx
import { VowelProvider, VowelAgent } from '@vowel.to/client/react';
import { Vowel, createDirectAdapters } from '@vowel.to/client';
import { useRouter } from 'next/navigation';

function App() {
  const router = useRouter();
  
  // Create adapters
  const { navigationAdapter, automationAdapter } = createDirectAdapters({
    navigate: (path) => router.push(path),
    routes: [
      { path: '/', description: 'Home page' },
      { path: '/products', description: 'Browse products' },
      { path: '/cart', description: 'Shopping cart' }
    ],
    enableAutomation: true
  });

  // Initialize Vowel
  const vowel = new Vowel({
    appId: process.env.NEXT_PUBLIC_VOWEL_APP_ID!,
    navigationAdapter,
    automationAdapter
  });

  // Register custom actions
  vowel.registerAction('searchProducts', {
    description: 'Search for products',
    parameters: {
      query: { type: 'string', description: 'Search query' }
    }
  }, async ({ query }) => {
    // Your search logic
    return { success: true };
  });

  return (
    <VowelProvider client={vowel}>
      <YourApp />
      <VowelAgent 
        position="bottom-right"
        showTranscripts={true}
      />
    </VowelProvider>
  );
}

What's Next?

Now that you have a basic voice-enabled application, explore these topics:

Common Issues

Microphone Not Working

Ensure you're running on HTTPS. Browsers block microphone access on HTTP (except localhost).

Voice Commands Not Working

  1. Check that your App ID is correct
  2. Ensure routes are properly configured
  3. Verify actions are registered before starting the session
  4. Check browser console for errors

Make sure your navigate function is correctly wired to your router:

typescript
// Next.js
navigate: (path) => router.push(path)

// React Router
navigate: (path) => navigate(path)

// Vue Router
navigate: (path) => router.push(path)

Need Help?