在当今全球化的科研领域,英语已成为学术交流的通用语言。然而,对于非英语母语的科研工作者来说,语言障碍往往成为他们发表高质量学术论文的拦路虎。为了解决这一问题,我们团队开发了一款名为“英语翻译官”的智能翻译工具,它会在Intel LLM比赛中大放异彩。今天,我将带大家深入了解这款工具的背景、功能、技术细节以及它如何帮助科研工作者。
项目背景
科研过程中,翻译问题一直是科研工作者面临的难题。为了克服这一障碍,我们团队利用通义千问大模型,研发了“英语翻译官”。这款工具旨在帮助科研人员在文献阅读、文献翻译、语法修改和措辞优化等方面提高效率和质量。
工作概述
“英语翻译官”的工作流程可以概括为以下几个步骤:
- 文献撰写:帮助研究人员优化措辞和用词,确保文档清晰、简洁、易懂。
- 文献阅读:快速查找相关文章、摘要和其他文献,节省时间和精力。
- 语法修改:识别和纠正句子结构、标点符号等语法错误。
- 措辞优化:进一步提升文档的表达质量。
项目演示
我们的工具提供了一个直观的APP界面,用户可以轻松地上传文档并获取翻译结果。此外,我们注意到在处理复杂数据集时,需要特别注意类别不平衡和边界问题,以保证翻译的准确性和质量。
技术细节
开发“英语翻译官”时,我们关注以下几个关键技术细节:
- 数据集的选择:我们选择了包含大量英文文本的多样化数据集,以确保模型的广泛适用性。
- 模型的架构:我们采用了当前流行的模型架构,如Transformer、BERT、GPT等,以满足不同应用场景的需求。
- 训练策略:我们根据数据集和模型架构制定了合适的训练策略,包括学习率调整、批量大小等。
- 语言模型的微调:在模型训练完成后,我们进行了有监督和无监督的微调,以适应具体的应用场景。
- 模型效果评估:我们通过多指标测试和人工评估,确保了模型的高质量和实用性。
模型训练:
from transformers import (
AutoTokenizer,
AutoModelForSeq2SeqLM,
Seq2SeqTrainingArguments,
Seq2SeqTrainer,)
# 加载数据集: 假设你的数据集是一个CSV文件,其中包含两列:input_text(源语言文本)和translation_text(目标语言文本,这里是英语)。
from datasets import load_dataset, DatasetDict, Dataset
dataset = load_dataset('csv', data_files={
'train': 'path_to_train_data.csv', 'validation': 'path_to_val_data.csv'})
model_name = "t5-base" # 选择一个适合翻译任务的预训练模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
def preprocess_function(examples):
inputs = [doc.strip() for doc in examples["input_text"]]
outputs = [doc.strip() for doc in examples["translation_text"]]
model_inputs = tokenizer(inputs, text_target=outputs,
padding="max_length", truncation=True)
# 在模型输入中,我们添加一个特殊的标记来表示序列的开始
model_inputs["decoder_input_ids"] = [[tokenizer.bos_token_id] +
input_ids for input_ids in model_inputs["input_ids"]]
return model_inputs
构建web页面
class SocketIOOutput(OutputChannel):
@classmethod
def name(cls):
return "socketio"
def __init__(self, sio, sid, bot_message_evt, message):
self.sio = sio
self.sid = sid
self.bot_message_evt = bot_message_evt
self.message = message
async def _send_audio_message(self, socket_id, response, **kwargs: Any):
# type: (Text, Any) -> None
"""Sends a message to the recipient using the bot event."""
ts = time.time()
OUT_FILE = 'voice_Friday/' + str(ts) + '.wav'
link = "http://localhost:8888/" + OUT_FILE
tts(response['text'], OUT_FILE)
print("response['text']============================" + response['text'])
# wav_norm = self.tts_predict(response['text'], OUT_FILE)
await self.sio.emit(self.bot_message_evt, {'text': response['text'], "link": link}, room=socket_id)
async def send_text_message(self, recipient_id: Text, message: Text, **kwargs: Any) -> None:
"""Send a message through this channel."""
await self._send_audio_message(self.sid, {"text": message})
class SocketIOInput(InputChannel):
"""A socket.io input channel."""
@classmethod
def name(cls):
return "socketio"
@classmethod
def from_credentials(cls, credentials):
credentials = credentials or {}
return cls(credentials.get("user_message_evt", "user_uttered"),
credentials.get("bot_message_evt", "bot_uttered"),
credentials.get("namespace"),
credentials.get("session_persistence", False),
credentials.get("socketio_path", "/socket.io"),
)
def __init__(self,
user_message_evt: Text = "user_uttered",
bot_message_evt: Text = "bot_uttered",
namespace: Optional[Text] = None,
session_persistence: bool = False,
socketio_path: Optional[Text] = '/socket.io'
):
self.bot_message_evt = bot_message_evt
self.session_persistence = session_persistence
self.user_message_evt = user_message_evt
self.namespace = namespace
self.socketio_path = socketio_path
def blueprint(self, on_new_message):
sio = AsyncServer(async_mode="sanic", cors_allowed_origins="*")
socketio_webhook = SocketBlueprint(
sio, self.socketio_path, "socketio_webhook", __name__
)
@socketio_webhook.route("/", methods=['GET'])
async def health(request):
return response.json({"status": "ok"})
@sio.on('connect', namespace=self.namespace)
async def connect(sid, environ):
logger.debug("User {} connected to socketIO endpoint.".format(sid))
print('Connected!')
@sio.on('disconnect', namespace=self.namespace)
async def disconnect(sid):
logger.debug("User {} disconnected from socketIO endpoint."
"".format(sid))
@sio.on('session_request', namespace=self.namespace)
async def session_request(sid, data):
print('This is sessioin request')
if data is None:
data = {}
if 'session_id' not in data or data['session_id'] is None:
data['session_id'] = uuid.uuid4().hex
await sio.emit("session_confirm", data['session_id'], room=sid)
logger.debug("User {} connected to socketIO endpoint."
"".format(sid))
@sio.on('user_uttered', namespace=self.namespace)
async def handle_message(sid, data):
output_channel = SocketIOOutput(sio, sid, self.bot_message_evt, data['message'])
if data['message'] == "/get_started":
message = data['message']
else:
##receive audio
path = 'voice_Friday/'
for l in os.listdir(path):
x = path + l
os.remove(x)
received_file = 'voice_person/you_said_voice.wav'
print("received_file==========================" + received_file)
urllib.request.urlretrieve(data['message'], received_file)
# path = os.path.dirname(__file__)
path = os.path.dirname(os.path.abspath(__file__))
audio_file = os.path.join(path, received_file)
# audio_file = path.join(received_file)
print("audio_file==================" + audio_file)
# fs, audio = wav.read("output_{0}.wav".format(sid))
# message = ds.stt(audio, fs)
# message = ''
message = asr(audio_file)
print("message==============" + message)
await sio.emit(self.user_message_evt, {"text": message}, room=sid)
message_rasa = UserMessage(message, output_channel, sid,
input_channel=self.name())
await on_new_message(message_rasa)
return socketio_webhook
创新之处
“英语翻译官”的创新之处在于它结合了最新的人工智能技术,提供了一个全面的解决方案,帮助中文科研工作者专注于科研本身,而不是被语言问题所困扰。它不仅能够优化英文表达,还能将中文翻译成英文,甚至辅助英文学习。
此外,它用了最先进的Intel One API以及openvino进行加速部署,是一个典型的使用大模型进行辅助我们工作的app。
结语
感谢您的观看。我们相信,“英语翻译官”将成为科研工作者的得力助手,帮助他们跨越语言障碍,更好地参与国际学术交流。我们期待与您一起见证这款工具如何改变科研工作的未来。
这篇博客文章基于“英语翻译官”项目的PPT内容,旨在向读者介绍这款工具的背景、功能、技术细节以及它如何帮助科研工作者。希望这篇文章能够帮助更多人了解并利用这一创新工具,提高科研工作的效率和质量。