Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions live-translation/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Your Fishjam app ID, available at https://fishjam.io/app/
VITE_FISHJAM_ID=your_fishjam_id

# Optional: override the Media over QUIC relay URL.
# Defaults to https://moq.fishjam.work/public when unset.
# VITE_MOQ_URL=https://moq.fishjam.work/public
28 changes: 28 additions & 0 deletions live-translation/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Dependencies
node_modules

# Build output
dist
dist-ssr
*.local

# Environment
.env

# Yarn (Corepack fetches the version pinned in package.json)
.yarn

# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Editor / OS
.idea
.vscode/*
!.vscode/extensions.json
.DS_Store
*.suo
*.sw?
1 change: 1 addition & 0 deletions live-translation/.yarnrc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
nodeLinker: node-modules
38 changes: 38 additions & 0 deletions live-translation/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Live Translation

Live streaming with real-time AI translation — powered by [Fishjam](https://fishjam.io),
Gemini, and [Media over QUIC](https://moq.dev). A publisher broadcasts their camera and
microphone, and viewers can watch the stream with AI-generated audio translation in the
language of their choice.

## Getting Started

1. Copy `.env.example` to `.env` and fill in your Fishjam app ID:

```bash
cp .env.example .env
```

You can obtain `VITE_FISHJAM_ID` by visiting https://fishjam.io/app/.

2. Install dependencies:

```bash
yarn
```

3. Start the development server:

```bash
yarn dev
```

4. Open the printed local URL. The home page is the publisher; share the `watch/<name>`
link with viewers to let them watch and pick a translation track.

## Environment Variables

| Variable | Required | Description |
| ------------------ | -------- | --------------------------------------------------------------------------- |
| `VITE_FISHJAM_ID` | Yes | Your Fishjam app ID, from https://fishjam.io/app/. |
| `VITE_MOQ_URL` | No | Override the Media over QUIC relay URL. Defaults to the built-in public relay. |
18 changes: 18 additions & 0 deletions live-translation/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Fishjam Live Translation</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&display=swap"
rel="stylesheet" />
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
45 changes: 45 additions & 0 deletions live-translation/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{
"name": "live-translation",
"private": true,
"version": "0.27.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc --noEmit && vite build",
"preview": "vite preview"
},
"dependencies": {
"@fishjam-cloud/react-client": "^0.27.0",
"@moq/publish": "0.2.11",
"@moq/signals": "^0.1.7",
"@moq/watch": "0.2.14",
"@radix-ui/react-icons": "^1.3.2",
"@radix-ui/react-label": "^2.1.0",
"@radix-ui/react-select": "^2.1.4",
"@radix-ui/react-slot": "^1.1.1",
"@svta/cml-utils": "1.4.0",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"lucide-react": "^0.476.0",
"next-themes": "^0.4.4",
"qrcode.react": "^4.2.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-router": "^7.1.5",
"sonner": "^2.0.3",
"tailwind-merge": "^3.0.2",
"tailwindcss-animate": "^1.0.7"
},
"devDependencies": {
"@types/node": "^22.12.0",
"@types/react": "^19.0.8",
"@types/react-dom": "^19.0.3",
"@vitejs/plugin-react-swc": "^3.7.2",
"autoprefixer": "^10.4.20",
"postcss": "^8.5.1",
"tailwindcss": "^3.4.17",
"typescript": "^5.7.3",
"vite": "^6.0.11"
},
"packageManager": "yarn@4.6.0"
}
6 changes: 6 additions & 0 deletions live-translation/postcss.config.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};
7 changes: 7 additions & 0 deletions live-translation/public/avatar.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions live-translation/public/favicon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions live-translation/public/fishjam-logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading