[GO] Ein Schüler erstellte einen Echtzeit-Sprachkonvertierungsdienst und schickte ihn an Github.

Leo ist ein Schüler, der gerne programmiert! !!

Dieses Mal habe ich einen Dienst erstellt, der Sprachen in Echtzeit konvertieren kann. Ich möchte ein wenig vorstellen und erklären, wie es gemacht wurde.

1. Idee

Die Idee kam mir, als ich die Übersetzungsfunktion von WeChat verwendete. Wenn ich in China einkaufe, habe ich manchmal ein Gespräch mit einem Angestellten über WeChat, aber es ist nicht in Echtzeit und ich übersetze jedes Mal. Ich konnte nicht ohne Anruf gehen, also erstellen wir einen Dienst, der in Echtzeit übersetzt werden kann und keinen Austausch von Freunden erfordert! Ich dachte, das wäre der Auslöser.

2. Verwendete Sprache und Technologie

Die verwendeten Programmiersprachen sind Node.js und Python. Ich verwende hauptsächlich Node.js und zeige Kommunikationsteile wie Socket.io und Vorlagen (EJS) auf Node.js an. Python verwendet Python, um eine Bibliothek namens googletrans zu verwenden Der Datenaustausch zwischen Node.js und Python erfolgt über eine Bibliothek namens Python-Shell.

3. Dateistruktur

transchat Dateistruktur


.
├── app.js
├── package-lock.json
├── package.json
├── public
│   ├── css
│   │   ├── chat
│   │   │   └── stylesheet.css
│   │   └── home
│   │       └── stylesheet.css
│   ├── img
│   │   └── button.svg
│   └── js
│       ├── chat
│       │   └── main.js
│       └── home
│           └── home.js
├── python
│   └── translate.py
└── templates
    ├── chat
    │   └── index.ejs
    └── home
        └── index.ejs

Für die Dateistruktur wurde der allgemeinen Expressstruktur eine Python-Datei (translate.py) zur Sprachkonvertierung hinzugefügt.

  1. Node.js

app.js



var express = require('express')
var app = express()
var http = require('http').createServer(app)
var io = require('socket.io')(http,{path:'/message'})
var uuid = require('node-uuid')
var {PythonShell} = require('python-shell')
app.use(express.static('public'))
app.set("view engine", "ejs")
var room = []
var lang = {}

app.get('/', function(req,res){
	res.render(__dirname+'/templates/home/index.ejs')
})

app.post('/transroom', function(req,res){
	var roomid = uuid.v4().split('-').join('')
	room.push(roomid)
	res.redirect('/transroom/'+roomid)
})

app.get('/transroom/:roomid', function(req, res){
	if(room.includes(req.params.roomid)){
		res.render(__dirname+'/templates/chat/index.ejs')
	}else{
		res.redirect('/')
	}
})

function trans_mes(mes, before_lang, trans_lang, send_user){
	if(1300 >= mes.length){
		var pyshell = new PythonShell('./python/translate.py')
		pyshell.send(JSON.stringify({'transdata':mes,'translang':trans_lang,'sendlang':before_lang}))
		pyshell.on('message', function(data){
			if(data == 'translate_error'){
				io.to(send_user).emit('message', 'servererror')
			}else{
				io.to(send_user).emit('message', JSON.parse(data))
			}
		})
	}else{
		io.to(send_user).emit('message', 'error')
	}
}

Hier ist der Hauptcode von Node.js.

Die Zeilen 1 bis 6 sind erforderliche Bibliotheken: Express, Socket.io, Node-uuid, Python-Shell wird gelesen. Die Zeilen 7 und 8 geben den öffentlichen Dateipfad und die Vorlagen-Engine an.

In den Zeilen 16 bis 20 wird eine eindeutige RoomID erstellt, die RoomID zum Raumarray hinzugefügt und der Benutzer umgeleitet. In den Zeilen 22-28 wird überprüft, ob die angeforderte RoomID im Raumarray vorhanden ist, die Vorlage angezeigt, falls dies der Fall ist, und umgeleitet, wenn dies nicht der Fall ist.

In der Funktion trans_mes werden die zu übersetzende Nachricht, die Sprache des sendenden Benutzers, die Sprache des Zielbenutzers und die SocketID des Ziels erfasst, und unter Verwendung dieser Daten wird Python mit Python-Shell ausgeführt, und die übersetzten Daten sind Socket. Ich sende mit .io. Aufgrund der Verwendung von Googletrans gibt es jedoch eine Zeichenbeschränkung, und wir überprüfen die Anzahl der Zeichen, bevor wir Python ausführen.

  1. Socket.io

app.js


io.on('connection', function(socket){
	var roomid = socket.handshake.headers.referer.split('/')[4]
	if(roomid != null){
 		socket.join(roomid)
 		var room_user_count = io.sockets.adapter.rooms[roomid].length
 		if(room_user_count == 1){
 			io.to(socket.id).emit('sys', {'roomid':roomid})
 		}else if(room_user_count == 2){
 			socket.broadcast.to(roomid).emit('sys', 'join_user')
 		}else if(room_user_count >= 3){
 			io.to(socket.id).emit('sys', 'redirect')
 		}
 		
		socket.on('message', function(msg,sendlang){
			var client_list = io.sockets.adapter.rooms[roomid].sockets
			for (var clientId in client_list ) {
				if(socket.id != clientId && lang[clientId]){
					trans_mes(msg, lang[socket.id], lang[clientId], clientId)
				}
			}
		})
		
		socket.on('lang', function(user_lang){
			lang[socket.id] = user_lang
		})
		
		socket.on('disconnect', function(){
			socket.leave(roomid)
			if(io.sockets.adapter.rooms[roomid] == null){
				var list_room_id = room.indexOf(roomid)
				if (list_room_id > -1) {
					room.splice(list_room_id, 1)
				}
			}else{
				if(io.sockets.adapter.rooms[roomid].length == 1){
					socket.broadcast.to(roomid).emit('sys', {'user_out':roomid})
				}
			}
  		})
  	}
})

Dies ist der Socket.io-Teil. Holen Sie sich zuerst die von var roomid = socket.handshake.headers.referer.split ('/') [4] angeforderte RoomID und dann die von` socket.join (roomid) angeforderte RoomID Sie betreten den Raum mit ``.

app.js


socket.on('message', function(msg,sendlang){
    var client_list = io.sockets.adapter.rooms[roomid].sockets
    for (var clientId in client_list ) {
        if(socket.id != clientId && lang[clientId]){
            trans_mes(msg, lang[socket.id], lang[clientId], clientId)
        }
    }
})

In Bezug auf die Nachrichtenfunktion ruft `var client_list = io.sockets.adapter.rooms [roomid] .sockets `part die Liste der Benutzer ab, die sich im Raum befinden.

app.rb


for (var clientId in client_list ) {
    if(socket.id != clientId && lang[clientId]){
        trans_mes(msg, lang[socket.id], lang[clientId], clientId)
    }
}

Teilen Sie als Nächstes die Liste der Benutzer durch. Verwenden Sie für Minuten die if-Anweisung, um einen anderen als den Absender auszuwählen, und führen Sie die Funktion trans_mes aus. Dadurch wird die übersetzte Nachricht an andere Benutzer als den Absender gesendet.

  1. Python

python/translate.py


from googletrans import Translator
import json
import sys
translator = Translator()

try:
	data = sys.stdin.readline()
	data_json = json.loads(data)
	lang = data_json['translang']
	sendlang = data_json['sendlang']
	translate = translator.translate(data_json['transdata'], src=sendlang, dest=lang)
	json = json.dumps({'trans_data':translate.text,'original_data':data_json['transdata'],'user_lang':lang,'trans_lang':translate.src},ensure_ascii=False)
	print(json)
except Exception as e:
	print('translate_error')

Der Python-Code ist einfach: Rufen Sie die in Node.js angegebenen Informationen mit `` sys.stdin.readline () `ab, übersetzen Sie sie mit googletrans und konvertieren Sie sie im Json-Format in Node.js. Ich konvertiere.

7. Schließlich.

Es war mein erstes Mal, dass ich Socket.io geschrieben habe, aber es war ziemlich einfach und hat Spaß gemacht. Der Code ist jedoch für einen einfachen Dienst kompliziert geworden, daher hoffe ich, dass ich ihn in Zukunft weiter aktualisieren kann (Pururiku ist willkommen!).

Wenn Sie möchten, würde ich mich freuen, wenn Sie es installieren und ausprobieren könnten.

git clone https://github.com/lra21711214/transchat.git
cd transchat
npm install
node app.js

Sie können es einfach versuchen, indem Sie Git installieren und npm so installieren, also bitte! !!

※Hinweis※ Wenn Sie es tatsächlich in einer Produktionsumgebung verwenden, speichern Sie das Raumlayout und die Sprachinformationen des Benutzers in der Datenbank und speichern Sie den Übersetzungsteil Amazon Translate. ), Cloud Translation, DeepL API usw. Bitte. Es ist nicht für die Produktionsumgebung vorgesehen, da es als Testversion erstellt wurde.

Recommended Posts

Ein Schüler erstellte einen Echtzeit-Sprachkonvertierungsdienst und schickte ihn an Github.
[Python] Ein Schüler der Mittelstufe implementierte Perceptron und versuchte, Iris zu klassifizieren.
Erstellt ein Modul zur Überwachung von Datei- und URL-Aktualisierungen
Exportieren Sie Qiitas eigenen Artikel und senden Sie ihn an Github
Schritte zum Erstellen eines Jobs, der ein Docker-Image abruft und mit Github-Aktionen testet