> ## Documentation Index
> Fetch the complete documentation index at: https://docs.qawolf.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Microphone injection (Web)

> Replace the browser's microphone input with an audio file to test voice and speech features in web apps.

Use Playwright's fake media device flags to inject a pre-recorded audio file as the browser's microphone input. This lets you test voice-activated features, speech recognition, and audio processing in web apps under controlled, repeatable conditions.

<Note>
  WAV format is recommended. Store your audio file in team storage and reference it via `process.env.TEAM_STORAGE_DIR`. See [Upload files](/qawolf/Uploading-manually) for instructions.
</Note>

<Warning>
  Playwright initializes the fake audio device once per browser instance. You cannot swap the audio file mid-flow. If you need to test with different audio inputs, launch a new browser instance for each.
</Warning>

## Examples

**Inject audio into the browser microphone**

```typescript theme={null}
const { context } = await launch({
  permissions: ["microphone"],
  args: [
    "--use-fake-device-for-media-stream",
    "--use-fake-ui-for-media-stream",
    `--use-file-for-fake-audio-capture=${process.env.TEAM_STORAGE_DIR}/voice-input.wav`,
  ],
});

const page = await context.newPage();
await page.goto("https://your-app.com");

// trigger the feature that reads from the microphone
```

## When to use

* Your app has speech recognition and you need to test that specific voice commands are interpreted correctly.
* Your app has voice-activated controls and you need to verify they produce the expected behavior.
* Your app processes or transforms microphone input and you need to assert on the output.
* Your app has voice-controlled accessibility features and you need to confirm they work as expected.

## Full sample test

```typescript theme={null}
import { flow, launch } from "@qawolf/flows/web";

export default flow(
  "Test voice input",
  "Web - Chrome",
  async ({ test }) => {
    const { context } = await launch({
      permissions: ["microphone"],
      args: [
        "--use-fake-device-for-media-stream",
        "--use-fake-ui-for-media-stream",
        `--use-file-for-fake-audio-capture=${process.env.TEAM_STORAGE_DIR}/voice-input.wav`,
      ],
    });

    const page = await context.newPage();

    await test("inject audio and verify voice command response", async () => {
      // Arrange
      await page.goto("https://your-app.com/voice");
      await page.locator(`[data-testid='mic-button']`).waitFor({ state: "visible" });

      // Act
      await page.locator(`[data-testid='mic-button']`).click();
      await page.waitForTimeout(5_000);

      // Assert
      await expect(page.locator(`[data-testid='transcript']`)).toContainText("hello");
    });
  },
);
```
