翻訳機いらずの未来、ついに来た。
海外で今じわじわ注目を集めているプロジェクト、それが「RTranslator」。
これはAndroidスマートフォン1台で動作する、完全オフラインの同時通訳アプリ。
しかもオープンソースで、無料で使える上に、ソースコードまで公開されています。
しかも日本語ではまだほとんど紹介されていません。
本記事ではこの「RTranslator」の仕組み、話題性、自作方法まで一気に解説します!
RTranslatorとは?
- イタリアの開発者 Luca Martino 氏(@niedev)が開発
- 完全無料・オフライン・スマホ単体で同時通訳
- GitHubでソースコードが公開中
- ネット接続不要(Bluetooth接続でやりとり)
要するに、「翻訳機なしで会話できる未来」が今ここにあるんです。
3つの利用モード
- Conversationモード
複数端末をBluetoothで接続して、双方がリアルタイムで通訳できるモード。
各ユーザーはスマホ+イヤホンで自然に会話できます。 - Walkie-Talkieモード
1台のスマホで交互に通訳するモード。自動言語判定もあり。
旅行先などで便利。 - テキスト翻訳モード
テキストベースの翻訳。音声なしでも使えるので、書類確認や翻訳学習にも。
なにがスゴイの?技術の中身
使われているのは、以下の最新オープンソースAI技術。
- 音声認識:OpenAI Whisper
約99言語対応。音声からテキストを高精度に変換。 - 翻訳:MetaのNLLB-200
200言語対応の機械翻訳モデル。軽量モデルを使ってモバイル動作を実現。 - 音声合成:Android標準TTS
Google TTSなど、スマホに内蔵された読み上げ機能を活用。これも完全オフライン。
この組み合わせにより、クラウドやサーバーに依存せずに翻訳が完結します。
なぜバズった?
- Product Huntで2024年9月に話題沸騰
- Hacker Newsで「まるでStar Trekの翻訳機」と称賛
- GitHubのスター数は7,000超え
- 「プライバシーを守れる翻訳機」として技術者に大ウケ
自分で再現できる?
できます。しかも、PCでもPythonで以下のように作れます。
1. Whisperで音声認識
import whisper
model = whisper.load_model("small")
result = model.transcribe("speech.wav", language="en")
print(result["text"])
翻訳(Hugging Face)
from transformers import pipeline
translator = pipeline("translation", model="Helsinki-NLP/opus-mt-en-jap")
print(translator("How are you?")[0]['translation_text'])
音声合成(TTS)
import pyttsx3
engine = pyttsx3.init()
engine.say("こんにちは。翻訳完了です。")
engine.runAndWait()
この3ステップだけで、シンプルな翻訳機が完成。
さらに高度なことをしたければ、Androidアプリ化も視野に入ります。
応用例もいろいろ!
- ZoomやTeamsと組み合わせて多言語会議
- スマートグラスに字幕表示
- 音声翻訳付きのチャットボット
- オフライン環境(災害支援など)での通訳支援
なぜ今こそ注目すべきか?
日本ではまだほとんど知られていませんが、RTranslatorはまさに「言語の壁をぶち壊す」ための最先端ツール。
Google翻訳やポケトークが不要になるかもしれない――そんな時代が近づいています。
しかもオープンソースで、自分で改良もできる。
ダウンロード・参考リンク
- GitHub(コード):https://github.com/niedev/RTranslator
- Android公式サイト:https://rtranslator.app
🎯 おまけ
ZoomやTeamsのビデオ会議に参加中、
- 各参加者の発言をリアルタイムで文字起こし(Whisper)
- 任意の言語へリアルタイム翻訳(NLLBまたは他翻訳API)
- 翻訳結果を「字幕」として表示(オーバーレイ or ブラウザ)
のサンプルを作ります。
🛠️ フルスタック構成(概要図)
[Zoom/Teams 会議] ──> [ローカルマイクで音声取得]
↓
[Whisperで文字起こし (Speech to Text)]
↓
[翻訳API/NLLBで他言語へ変換]
↓
[翻訳字幕をブラウザに表示 or OBSオーバーレイ]
🧩 構成要素
要素 | 技術 | 詳細 |
---|---|---|
音声キャプチャ | PyAudio / sounddevice | PCマイクから音声を録音 |
音声認識 | OpenAI Whisper / faster-whisper | ローカルで音声 → テキスト変換 |
翻訳 | HuggingFace Transformers (NLLB or Helsinki-NLP) | 日本語⇄英語 など多言語対応 |
字幕表示 | Flask + WebSocket + HTML字幕UI / OBS Overlays | ローカル or ブラウザで字幕表示 |
✅ ステップ1:PCマイクから音声取得(リアルタイム)
import sounddevice as sd
import numpy as np
import wave
def record_audio(filename="recording.wav", duration=5):
fs = 16000 # Whisper推奨サンプルレート
print("録音中...")
audio = sd.rec(int(duration * fs), samplerate=fs, channels=1, dtype='int16')
sd.wait()
with wave.open(filename, 'wb') as wf:
wf.setnchannels(1)
wf.setsampwidth(2)
wf.setframerate(fs)
wf.writeframes(audio.tobytes())
✅ ステップ2:Whisperで文字起こし
import whisper
model = whisper.load_model("small")
result = model.transcribe("recording.wav")
print("原文:", result["text"])
✅ ステップ3:翻訳(例:英→日)
from transformers import pipeline
translator = pipeline("translation", model="Helsinki-NLP/opus-mt-en-jap")
translated = translator(result["text"])
print("翻訳:", translated[0]['translation_text'])
✅ ステップ4:字幕を表示(Flask + WebSocket)
簡易字幕サーバーのUI例を作成可能です。例えば:
- FlaskサーバーでWebSocket接続
- ブラウザ上にリアルタイム表示
- またはOBSでウィンドウキャプチャ
💬 応用アイデア
- 複数ユーザー用:Zoom参加者ごとにローカルで同様の処理
- Teams Bot連携:Botが会話ログを取得して翻訳
- クラウド構成:音声をサーバーに送り、翻訳して返すAPI構成も可
Flask+Web UI字幕付き
次のようなディレクトリ構成にしてください👇
your_project/
├── app.py ← このファイル(Flask+Whisperアプリ本体)
├── templates/
│ └── index.html ← Webブラウザで字幕を表示するHTML
✅ 手順まとめ
- 任意のフォルダを作成(例:
realtime_translation
) - Python コードを
app.py
という名前で保存 - 同じディレクトリ内に
templates
フォルダを作成 templates/index.html
に字幕表示用のHTMLを保存(前回提供したHTML)
✅ 特徴
- PCマイクから5秒ごとに録音
- Whisperで音声認識(日本語含む多言語対応)
- HuggingFaceの翻訳モデルで日⇄英翻訳
- Flask + Socket.IO で翻訳結果をブラウザにリアルタイム表示
🔧 必要なもの(事前にインストール)
pip install flask flask-socketio sounddevice transformers torch openai-whisper
📂 必要なファイル
まず、app.pyを下記の内容で作成します
# Realtime Speech Translation Web App (Flask + WebSocket + Whisper + HuggingFace)
import os
import time
import whisper
import threading
import sounddevice as sd
import numpy as np
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
from transformers import pipeline
import tempfile
import wave
# Initialize components
app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins="*")
model = whisper.load_model("small")
translator = pipeline("translation", model="Helsinki-NLP/opus-mt-en-jap")
# Audio config
FS = 16000
CHANNELS = 1
RECORD_SECONDS = 5
def record_audio_to_file():
"""Record from microphone and return temporary WAV file path."""
tmp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
print("[INFO] Recording...")
audio = sd.rec(int(RECORD_SECONDS * FS), samplerate=FS, channels=CHANNELS, dtype='int16')
sd.wait()
with wave.open(tmp_file.name, 'wb') as wf:
wf.setnchannels(CHANNELS)
wf.setsampwidth(2)
wf.setframerate(FS)
wf.writeframes(audio.tobytes())
print("[INFO] Recording saved to:", tmp_file.name)
return tmp_file.name
def recognize_and_translate():
"""Background thread: records, transcribes, translates, and emits results."""
while True:
try:
wav_path = record_audio_to_file()
result = model.transcribe(wav_path)
original_text = result['text']
translation = translator(original_text)[0]['translation_text']
print(f"[INFO] Original: {original_text} | Translated: {translation}")
socketio.emit('subtitle', {'original': original_text, 'translated': translation})
os.remove(wav_path)
except Exception as e:
print("[ERROR]", e)
time.sleep(1)
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('connect')
def on_connect():
print("[INFO] Client connected")
if __name__ == '__main__':
# Start background transcription thread
threading.Thread(target=recognize_and_translate, daemon=True).start()
# Run Flask app
socketio.run(app, host='0.0.0.0', port=5000)
以下の templates/index.html
を用意してください
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Live Translation Subtitles</title>
<script src="https://cdn.socket.io/4.3.2/socket.io.min.js"></script>
<style>
body { font-family: sans-serif; background: #111; color: #fff; text-align: center; margin-top: 50px; }
.subtitle { font-size: 1.5em; margin: 1em; }
</style>
</head>
<body>
<h1>🎙️ 多言語リアルタイム翻訳</h1>
<div class="subtitle" id="original"></div>
<div class="subtitle" id="translated"></div>
<script>
const socket = io();
socket.on('subtitle', data => {
document.getElementById('original').textContent = '🗣️ 発話: ' + data.original;
document.getElementById('translated').textContent = '🌐 翻訳: ' + data.translated;
});
</script>
</body>
</html>
🚀 起動方法
python app.py
→ http://localhost:5000
を開くと、字幕がリアルタイム表示されます。
さらに次のステップとして次の実装をすると良いかと思います
- OBSオーバーレイ対応(HTML表示をクロマキー合成)
- Zoom連携(ZoomクライアントSDKか仮想マイク経由)
- Teams連携Bot(Graph API + Azure Bot Framework)
🧪 ヒント
- Whisperは音声認識に数秒かかるため、翻訳まで最大5〜10秒ほどの遅延があります
- Whisperモデルは
"base"
や"medium"
に変更可能ですが、処理時間が長くなります - 翻訳精度を上げたい場合、NLLBや他モデルへの切り替えも可能です
結論:音声翻訳の“民主化”が始まった
「音声翻訳機を全員が持てる時代」が始まっています。
しかもその中核が、無料・オープン・誰でも改造可能というのは衝撃的。
ぜひ一度、RTranslatorを触ってみてください。
自作もできるし、未来を感じるはずです。