Lie Better: 120 Seconds is a voice-driven persuasion game built with Next.js. You are dropped into a 120-second conversation, judged on what you say and how you sound, and forced to earn trust before the clock runs out.
The current build includes two playable scenarios:
This project has been developed for the Mistral Worldwide Hackathon - Tokyo: a 32-hours hackathon hosted at Google for Startups offices in Shibuya, organized by Mistral AI. The team "GOLDEN G-AI" was composed by three hackers out of the 700 selected out of more than 7000 applicants in the 7 cities that hosted this hackathon at the same time.
This repo experiments with a simple game loop powered by three signals at once:
Instead of treating voice as a text input shortcut, the game makes delivery matter. Emotion affects suspicion, stage progression, and whether the NPC helps or shuts you down.
Whatch the demo video at this youtube link.
There is also a no-mic fallback for testing and demos through typed input and quick-response buttons.



MediaRecorderoutput/web-game/3loi/SER-Odyssey-Baseline-WavLM-Categoricalnpm install
cp .env.example .env
npm run dev
Then open http://localhost:3000.
Required:
MISTRAL_API_KEY=YOUR_KEY_HERE
ELEVENLABS_API_KEY=YOUR_KEY_HERE
Common defaults:
MISTRAL_MODEL=mistral-large-latest
MISTRAL_TRANSCRIPTION_MODEL=voxtral-mini-latest
ELEVENLABS_MODEL_ID=eleven_flash_v2_5
ELEVENLABS_VOICE_ID=zYcjlYFOd3taleS0gkk3
ELEVENLABS_VOICE_ID_LEVEL_2=ocZQ262SsZb9RIxcQBOj
ELEVENLABS_OUTPUT_FORMAT=mp3_22050_32
ELEVENLABS_OPTIMIZE_STREAMING_LATENCY=4
EMOTION_LOCAL_URL=http://127.0.0.1:5050
EMOTION_MODEL=3loi/SER-Odyssey-Baseline-WavLM-Categorical
NEXT_PUBLIC_SUICA_MINIGAME_TEST_SKIP=1
Start the local FastAPI service in a separate terminal:
cd services/emotion
pip install -r requirements.txt
python serve.py --host 0.0.0.0 --port 5050
The web app can run without emotion classification, but the intended gameplay depends on that service being available.
GET /api/health health checkPOST /api/transcribe audio upload, transcription, optional emotion analysisGET /api/tts low-latency streamed NPC voicePOST /api/tts buffered NPC voice fallbackPOST /api/evaluate game-state evaluation and NPC reply generationapp/
api/
evaluate/ LLM game-state evaluation
health/ health endpoint
transcribe/ speech-to-text + emotion hook
tts/ NPC voice synthesis
components/ HUD, controls, chat, timer, meters
page.tsx main game client
lib/
mistral.ts Mistral API helpers
elevenlabs.ts ElevenLabs API helpers
local-emotion.ts local FastAPI emotion client
services/emotion/ Python emotion inference service
public/assets/ backgrounds, sprites, music, SFX
output/web-game/ captured screenshots and state dumps
npm run dev start the local dev servernpm run build create a production buildnpm run start serve the production buildnpm run lint run ESLintMediaRecorder support.ffmpeg to normalize uploaded audio.TypeScript
76.6%
CSS
13.2%
JavaScript
5.3%
Python
4.9%
Lie Better: 120 Seconds is a voice-driven persuasion game built with Next.js. You are dropped into a 120-second conversation, judged on what you say and how you sound, and forced to earn trust before the clock runs out.
The current build includes two playable scenarios:
This project has been developed for the Mistral Worldwide Hackathon - Tokyo: a 32-hours hackathon hosted at Google for Startups offices in Shibuya, organized by Mistral AI. The team "GOLDEN G-AI" was composed by three hackers out of the 700 selected out of more than 7000 applicants in the 7 cities that hosted this hackathon at the same time.
This repo experiments with a simple game loop powered by three signals at once:
Instead of treating voice as a text input shortcut, the game makes delivery matter. Emotion affects suspicion, stage progression, and whether the NPC helps or shuts you down.
Whatch the demo video at this youtube link.
There is also a no-mic fallback for testing and demos through typed input and quick-response buttons.



MediaRecorderoutput/web-game/3loi/SER-Odyssey-Baseline-WavLM-Categoricalnpm install
cp .env.example .env
npm run dev
Then open http://localhost:3000.
Required:
MISTRAL_API_KEY=YOUR_KEY_HERE
ELEVENLABS_API_KEY=YOUR_KEY_HERE
Common defaults:
MISTRAL_MODEL=mistral-large-latest
MISTRAL_TRANSCRIPTION_MODEL=voxtral-mini-latest
ELEVENLABS_MODEL_ID=eleven_flash_v2_5
ELEVENLABS_VOICE_ID=zYcjlYFOd3taleS0gkk3
ELEVENLABS_VOICE_ID_LEVEL_2=ocZQ262SsZb9RIxcQBOj
ELEVENLABS_OUTPUT_FORMAT=mp3_22050_32
ELEVENLABS_OPTIMIZE_STREAMING_LATENCY=4
EMOTION_LOCAL_URL=http://127.0.0.1:5050
EMOTION_MODEL=3loi/SER-Odyssey-Baseline-WavLM-Categorical
NEXT_PUBLIC_SUICA_MINIGAME_TEST_SKIP=1
Start the local FastAPI service in a separate terminal:
cd services/emotion
pip install -r requirements.txt
python serve.py --host 0.0.0.0 --port 5050
The web app can run without emotion classification, but the intended gameplay depends on that service being available.
GET /api/health health checkPOST /api/transcribe audio upload, transcription, optional emotion analysisGET /api/tts low-latency streamed NPC voicePOST /api/tts buffered NPC voice fallbackPOST /api/evaluate game-state evaluation and NPC reply generationapp/
api/
evaluate/ LLM game-state evaluation
health/ health endpoint
transcribe/ speech-to-text + emotion hook
tts/ NPC voice synthesis
components/ HUD, controls, chat, timer, meters
page.tsx main game client
lib/
mistral.ts Mistral API helpers
elevenlabs.ts ElevenLabs API helpers
local-emotion.ts local FastAPI emotion client
services/emotion/ Python emotion inference service
public/assets/ backgrounds, sprites, music, SFX
output/web-game/ captured screenshots and state dumps
npm run dev start the local dev servernpm run build create a production buildnpm run start serve the production buildnpm run lint run ESLintMediaRecorder support.ffmpeg to normalize uploaded audio.TypeScript
76.6%
CSS
13.2%
JavaScript
5.3%
Python
4.9%