在当今全球化的科研领域,英语已成为学术交流的通用语言。然而,对于非英语母语的科研工作者来说,语言障碍往往成为他们发表高质量学术论文的拦路虎。为了解决这一问题,我们团队开发了一款名为“英语翻译官”的智能翻译工具,它会在Intel LLM比赛中大放异彩。今天,我将带大家深入了解这款工具的背景、功能、技术细节以及它如何帮助科研工作者。

项目背景

科研过程中,翻译问题一直是科研工作者面临的难题。为了克服这一障碍,我们团队利用通义千问大模型,研发了“英语翻译官”。这款工具旨在帮助科研人员在文献阅读、文献翻译、语法修改和措辞优化等方面提高效率和质量。

工作概述

“英语翻译官”的工作流程可以概括为以下几个步骤:

  1. 文献撰写:帮助研究人员优化措辞和用词,确保文档清晰、简洁、易懂。
  2. 文献阅读:快速查找相关文章、摘要和其他文献,节省时间和精力。
  3. 语法修改:识别和纠正句子结构、标点符号等语法错误。
  4. 措辞优化:进一步提升文档的表达质量。

项目演示

我们的工具提供了一个直观的APP界面,用户可以轻松地上传文档并获取翻译结果。此外,我们注意到在处理复杂数据集时,需要特别注意类别不平衡和边界问题,以保证翻译的准确性和质量。

英语翻译官:科研工作者的智能助手_技术细节

技术细节

开发“英语翻译官”时,我们关注以下几个关键技术细节:

  1. 数据集的选择:我们选择了包含大量英文文本的多样化数据集,以确保模型的广泛适用性。
  2. 模型的架构:我们采用了当前流行的模型架构,如Transformer、BERT、GPT等,以满足不同应用场景的需求。
  3. 训练策略:我们根据数据集和模型架构制定了合适的训练策略,包括学习率调整、批量大小等。
  4. 语言模型的微调:在模型训练完成后,我们进行了有监督和无监督的微调,以适应具体的应用场景。
  5. 模型效果评估:我们通过多指标测试和人工评估,确保了模型的高质量和实用性。

模型训练:

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内容,旨在向读者介绍这款工具的背景、功能、技术细节以及它如何帮助科研工作者。希望这篇文章能够帮助更多人了解并利用这一创新工具,提高科研工作的效率和质量。