News

【革命アプリ】スマホ1台で同時通訳!?海外でバズった「RTranslator」を徹底解説【自作もできる】

翻訳機いらずの未来、ついに来た。

海外で今じわじわ注目を集めているプロジェクト、それが「RTranslator」。
これはAndroidスマートフォン1台で動作する、完全オフラインの同時通訳アプリ
しかもオープンソースで、無料で使える上に、ソースコードまで公開されています。

しかも日本語ではまだほとんど紹介されていません。
本記事ではこの「RTranslator」の仕組み、話題性、自作方法まで一気に解説します!


RTranslatorとは?

  • イタリアの開発者 Luca Martino 氏(@niedev)が開発
  • 完全無料・オフライン・スマホ単体で同時通訳
  • GitHubでソースコードが公開中
  • ネット接続不要(Bluetooth接続でやりとり)

要するに、「翻訳機なしで会話できる未来」が今ここにあるんです。


3つの利用モード

  1. Conversationモード
    複数端末をBluetoothで接続して、双方がリアルタイムで通訳できるモード。
    各ユーザーはスマホ+イヤホンで自然に会話できます。
  2. Walkie-Talkieモード
    1台のスマホで交互に通訳するモード。自動言語判定もあり。
    旅行先などで便利。
  3. テキスト翻訳モード
    テキストベースの翻訳。音声なしでも使えるので、書類確認や翻訳学習にも。

なにがスゴイの?技術の中身

使われているのは、以下の最新オープンソース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翻訳やポケトークが不要になるかもしれない――そんな時代が近づいています。

しかもオープンソースで、自分で改良もできる。


ダウンロード・参考リンク

🎯 おまけ

ZoomやTeamsのビデオ会議に参加中、

  • 各参加者の発言をリアルタイムで文字起こし(Whisper)
  • 任意の言語へリアルタイム翻訳(NLLBまたは他翻訳API)
  • 翻訳結果を「字幕」として表示(オーバーレイ or ブラウザ)

のサンプルを作ります。

🛠️ フルスタック構成(概要図)

[Zoom/Teams 会議] ──> [ローカルマイクで音声取得]
                             ↓
              [Whisperで文字起こし (Speech to Text)]
                             ↓
               [翻訳API/NLLBで他言語へ変換]
                             ↓
            [翻訳字幕をブラウザに表示 or OBSオーバーレイ]

🧩 構成要素

要素技術詳細
音声キャプチャPyAudio / sounddevicePCマイクから音声を録音
音声認識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

✅ 手順まとめ

  1. 任意のフォルダを作成(例:realtime_translation
  2. Python コードを app.py という名前で保存
  3. 同じディレクトリ内に templates フォルダを作成
  4. 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を触ってみてください。
自作もできるし、未来を感じるはずです。