Build app chuyển text thành giọng nói NodeJS và AWS Polly

12 min


1063
1.6k share, 1063 points

Lời giới thiệu

Trong hướng dẫn này, chúng ta sử dụng AWS Polly và NodeJS để tạo một ứng dụng tích hợp tổng hợp văn bản thành giọng nói.

Tương tác giữa con người và máy tính là điều đã được mong đợi và khó nắm bắt. Các dịch vụ mới như Polly và Dịch vụ chuyển văn bản thành giọng nói của Google được xây dựng với tính năng tổng hợp Wavenets . Đã đưa chúng ta đến gần hơn với thời đại Star Trek. Nơi chúng ta có thể giao tiếp bằng lời nói và nhận phản hồi trong realtime từ hệ thống máy tính với giọng nói tự nhiên giống như con người.

Đó là hai dịch vụ đáng để bạn dành thời gian: Google TTS và Polly, một dịch vụ của Amazon giúp biến văn bản thành lời nói sống động như thật. Cho bạn khả năng tạo các ứng dụng nói chuyện.

A Case for AWS Polly

Điều khiến Polly trở nên khác biệt so với phần còn lại của các ứng dụng online và cài đặt tĩnh trực tuyến khác, là dịch vụ sử dụng quy trình tổng hợp thúc đẩy học sâu để vượt qua giới hạn của hệ thống chuyển văn bản thành giọng nói truyền thống.

Kể từ ngày 4 tháng 2 năm 2020, AWS đã công bố một tính năng mới trong Amazon Polly được gọi là Brand Voice. Điều này cho phép khách hàng hoặc người dùng làm việc với nhóm Amazon Polly gồm các nhà khoa học và nhà ngôn ngữ học nghiên cứu AI để giúp xây dựng giọng nói chuyển văn bản thành giọng nói (NTTS) độc quyền, chất lượng cao thể hiện tính cách thương hiệu của họ.

Amazon Polly mang đến là bạn có thể chọn từ nhiều giọng nói khác nhau. Bằng tiếng Anh, tiếng Đức, tiếng Ba Lan, tiếng Ý, tiếng Pháp và các giọng khác. Điều này giúp mang lại sự đa dạng và linh hoạt cho các ứng dụng tích hợp với Polly. Tận dụng Polly cũng cung cấp cho bạn quyền truy cập vào giọng Anh không thuần túy đàm thoại bằng giọng Anh. Điều này có thể giúp một số nhà nghiên cứu hiểu rõ hơn về nội dung đang được tổng hợp.

Bắt đầu

Hãy cùng bắt đầu triển khai AWS Polly trong thực tế. Các đoạn code mẫu bên dưới cho bạn biết cách bắt đầu với Polly. Không phải là ứng dụng toàn diện, nhưng nó minh họa khái niệm và việc bắt đầu tích hợp Polly vào ng dụng NodeJS. Các khái niệm được minh họa hầu như giống nhau trong các ngôn ngữ lập trình khác. Miễn là bạn đang tận dụng AWS SDK.

Văn bản tổng hợp thành bản ghi âm mẫu giọng nói như sau

Trên đây là cách âm thanh được tạo bởi AWS Polly Speech Synthesis (một trong những giọng AWS yêu thích của tôi.)

Để bắt đầu với Polly, bạn sẽ cần tài khoản AWS có bật tính năng thanh toán. ặc dù hướng dẫn này sẽ nằm trong giới hạn của tài nguyên cấp miễn phí.

Mức miễn phí AWS Polly bao gồm năm triệu ký tự mỗi tháng cho các yêu cầu về giọng nói hoặc Dấu giọng nói, trong 12 tháng đầu tiên, bắt đầu từ request đầu tiên của bạn. Đối với giọng nói thần kinh(Neural voices), cấp miễn phí bao gồm một triệu ký tự mỗi tháng cho các yêu cầu về giọng nói hoặc Dấu giọng nói, trong 12 tháng đầu tiên, bắt đầu từ request đầu tiên của bạn về giọng nói. Điều này là quá đủ để luyện tập trong dịch vụ.

Tạo tài khoản

Để tạo tài khoản cấp miễn phí, hãy đăng ký bằng cách tạo tài khoản tại đây.

Khi bạn đã đăng nhập, hãy sử dụng thanh điều hướng để tìm kiếm dịch vụ user IAM. Luôn đảm bảo không bao giờ sử dụng tài khoản gốc AWS (tài khoản admin ). Người dùng IAM cho phép bạn kiểm soát an toàn quyền truy cập vào các dịch vụ và tài nguyên AWS. Cho người dùng trong tài khoản AWS của bạn thông qua việc sử dụng các chính sách xác định hành động mà người dùng này có thể thực hiện.

NodeJS
IAM user menu

Nhấp vào User > Add User > Check programmatic access only có lập trình vì người dùng này sẽ chỉ call đến dịch vụ Polly thông qua code.

NodeJS
Create Polly User with Programmatic Access Only

Bước tiếp theo, chúng ta muốn đính kèm một chính sách (quyền). Vì mục đích đơn giản và thử nghiệm, bạn có thể cấp AmazonPollyFullAccess. Đối với production, bạn chỉ nên chọn các quyền mà ứng dụng của bạn yêu cầu để giảm thiểu rủi ro bảo mật.

NodeJS
Set Polly Access Full Permissions

Để xem thêm chi tiết về các quyền truy cập Polly, hãy nhấp vào danh sách mở rộng:

Image for post
List of all Polly permissions

Khi bạn đã nhấp vào next > Add user trang tóm tắt sẽ được hiển thị

Image for post
Add User Summary Page

Để biết thêm về users IAM và ranh giới quyền, bạn có thể xem tài liệu AWS. Sau khi hoàn tất việc tạo người dùng. Đảm bảo rằng bạn đã sao lưu thông tin đăng nhập của mình. Vì bạn sẽ cần định cấu hình chúng trong AWS CLI của mình .Hoặc xuất thông tin đăng nhập thông qua các biến môi trường.

Image for post
Credential Review Page

Điều kiện tiên quyết

Hãy bắt đầu xây dựng dự án đơn giản – trường hợp sử dụng đơn giản là tổng hợp một đoạn văn bản ngắn thành giọng nói.

Đầu tiên, hãy đảm bảo rằng bạn đã cài đặt NodeJS v11.10.0. Nếu cài đặt V11.10.0 xung đột với thiết lập NodeJS hiện có. Bạn có thể sử dụng NVM cho phép bạn chuyển đổi giữa phiên bản NodeJS. Đối với hướng dẫn nhanh này, sử dụng 11.10.0.

Cài đặt NodeJS 11.10.0 với NVM:

install nvm
nvm install 11.10.0

Let’s create a working directory for our Polly application, named polly, to hold your application source code and make that your current directory.

Hãy tạo một thư mục làm việc cho ứng dụng Polly, có tên là polly. Để giữ sourecode ứng dụng của bạn và tạo thư mục đó làm thư mục hiện tại của bạn.

Build Project Polly NodeJS

mkdir polly
cd polly
npm init -y

Argument -y cho biết NPM init tạo một package.json với các giá trị mặc định được xác định trước. Chạy các lệnh bên dưới để cài đặt các package NPM bắt buộc cần thiết trong đó. AWS-SDK bản chính thức cho JavaScript và package speaker là phiên bản luồng có thể ghi, chấp nhận dữ liệu âm thanh PCM và xuất nó ra loa của bạn.

npm install aws-sdk --save
npm install speaker --save

Tạo một tệp mới, index.js và thêm các câu lệnh Import NPM sau cho các package NPM bắt buộc:

const AWS = require('aws-sdk');
const Stream = require('stream');
const Speaker = require('speaker');
const fs = require('fs');

Bước tiếp theo, tạo ứng dụng client Polly đóng vai trò là giao diện cho dịch vụ AWS Polly. Client tóm tắt các lệnh gọi API REST cơ bản tới các dịch vụ AWS Polly:

// Create an Polly client
const Polly = new AWS.Polly({
    signatureVersion: 'v4',
    region: 'us-east-1'
});
// Create the Speaker instance
const Player = new Speaker({
    channels: 1,
    bitDepth: 16,
    sampleRate: 16000
});
// Define param object for more details around additional param attributes see https://docs.aws.amazon.com/polly/latest/dg/API_SynthesizeSpeech.html
let params = {
    'Text': 'Hi!, guys. this is AWS Polly service which does Speech synthesis. This is something we can definitely look at integrating as a service perhaps as a notification for mobile applications. The text synthesizing process is getting much better with machine learning. It doesn\'t sound too robotic anymore. A few years from now I think it will definitely sound more like human speech.',
    'OutputFormat': 'pcm',
    'VoiceId': 'Joanna'
};
Polly.synthesizeSpeech(params, (err, data) => {
    if (err) {
        console.log(err.code)
    } else if (data) {
        if (data.AudioStream instanceof Buffer) {
            //write Audio stream to file relative to this program
            fs.writeFile("./speech.mp3", data.AudioStream, function (err) {
                if (err) {
                    return console.log(err)
                }
                console.log("The file was saved!")
            });
            // Initiate the source
            let bufferStream = new Stream.PassThrough();
            // convert AudioStream into a readable stream
            bufferStream.end(data.AudioStream);
            // Pipe into Player
            bufferStream.pipe(Player);
        }
    }
});

Nếu bạn chưa lưu thông tin đăng nhập AWS của mình vào AWS CLI. Bạn có thể chọn đặt thông tin xác thực truy cập AWS mà bạn đã tải xuống theo cách thủ công. Tùy thuộc vào IDE bạn đang sử dụng, các cài đặt thường có thể được tìm thấy trong các tùy chọn cấu hình chạy. Tìm kiếm nhanh trên google “cách xác định biến môi trường trong {IDE_NAME}” sẽ mang lại một số tài nguyên hữu ích. Ngoài ra, bạn có thể sử dụng terminal để xuất biến môi trường

export AWS_ACCESS_KEY_ID={YOUR_ACCESS_KEY} && \
export AWS_SECRET_ACCESS_KEY={YOUR_SECRET_KEY} && \
export AWS_DEFAULT_REGION={YOUR_AWS_REGION}

Speech Synthesis Markup Language

Chuyển văn bản thành giọng nói yêu cầu SSML (Ngôn ngữ đánh dấu tổng hợp giọng nói).

Trong một số trường hợp,muốn kiểm soát thêm cách Polly tạo bài phát biểu từ văn bản. Ví dụ:muốn tạm dừng lâu hơn trong bài phát biểu hoặc muốn một chuỗi các chữ số được đọc lại như một số điện thoại chuẩn. Đây là lúc SSMLsupport mix. Vì nó cho phép bạn kiểm soát chi tiết hơn. Thêm thẻ SSML vào văn bản của bạn là một quy trình thủ công. Có thể được tự động hóa nếu bạn biết chính xác phải các thẻ trong văn bản của mình.

Mặc dù định nghĩa thẻ SSML là một quá trình liên quan nhiều hơn – có yếu tố con người và chạm vào văn bản tổng hợp văn bản trong các trường hợp sách điện tử. Điều đó sẽ tạo ra trải nghiệm nghe tốt hơn. Và có thể sẽ tạo ra các bản ghi chất lượng cao hơn gần với giọng nói tự nhiên của con người.

<speak>
    <prosody volume="loud">This is my Jira-ticket</prosody>
    <break time="1s" /> There are many like it, but this one is mine. My Jira-ticket is my best friend. It is my life. I must master it as I must master my life. My Jira-ticket, without me, is useless. Without my Jira-ticket, I am useless. I must make my jira-ticket whole and complete it. Complete it i will
</speak>

Tùy chọn nâng cao

Để thay đổi âm lượng cho bài phát biểu cho app NodeJS. Bạn có thể sử dụng các thẻ bên dưới.

  • volume="silen"t, x-soft, soft, medium, loud, x-loud: Đặt âm lượng thành giá trị xác định trước cho giọng nói hiện tại.
  • +ndB: Tăng âm lượng so với mức âm lượng hiện tại. Ví dụ: + 0dB có nghĩa là không thay đổi âm lượng. + 6dB xấp xỉ hai lần biên độ dòng điện. Giá trị dương tối đa là khoảng + 4.08dB.
  • -ndB: Giảm âm lượng so với mức âm lượng hiện tại. Ví dụ, -6dB có nghĩa là xấp xỉ một nửa biên độ hiện tại..

Để có danh sách toàn diện hơn về các thẻ SSML, hãy xem tài liệu AWS. Đoạn code trên không có tác dụng gì nhiều. Nó chỉ chuyển văn bản của bạn thành giọng nói có thể nghe được. Chúng ta có thể tiến thêm một bước nữa và tự động hóa quy trình.

Hãy lưu ý rằng việc xử lý văn bản của bạn rất đơn giản. hưng tìm ra cách để tích hợp nó vào ứng dụng của bạn cho một trường hợp sử dụng trong thế giới thực là một vấn đề hoàn toàn khác. Dưới đây, chúng ta sẽ thay đổi code để tự động hóa quá trình đọc. Trước tiên, chúng ta cần tận dụng một số package, cheerio và puppeteer .

Lưu ý – không nên sử dụng tính năng scrapping để loại bỏ nội dung trái phép. Đảm bảo rằng mục đích đã định không vi phạm bất kỳ chính sách nào.

npm install cheerio  --save
npm install puppeteer  --save
npm install aw-sdk --save

Code sẽ trông như sau

const fs = require('fs');
const AWS = require('aws-sdk');
const Stream = require('stream');
const Speaker = require('speaker');
const cheerio = require('cheerio');
const puppeteer = require('puppeteer');
// // Create an Polly client
const Polly = new AWS.Polly({
    signatureVersion: 'v4',
    region: 'us-east-1'
});
// Create the Speaker instance
const Player = new Speaker({
    channels: 1,
    bitDepth: 16,
    sampleRate: 16000
});
const textToSpeechConverter = (params, configs) => {
    Polly.synthesizeSpeech(params, (err, data) => {
        if (err) {
            throw err;
        } else if (data) {
            if (data.AudioStream instanceof Buffer) {
                // only works with  'OutputFormat': 'pcm'
                // Initiate the source
                let bufferStream = new Stream.PassThrough();
                // convert AudioStream into a readable stream
                bufferStream.end(data.AudioStream);
                // Pipe into Player
                bufferStream.pipe(Player);
            }
        }
    });
};
const url = [
    'https://medium.com/@django.course/quirky-things-programmers-say-98c05b858f72?source=friends_link&sk=3e406922601a0cc9ce528e051d24a1d3',
    'https://medium.com/poetry-after-dark/breath-of-another-85060e466804',
    'https://medium.com/@amirobin259/the-key-strategy-working-together-b6785f842e2d',
    'https://medium.com/@sparshachatterjee36/a-sad-story-dedd9d25970d'
];
puppeteer
    .launch()
    .then(browser => browser.newPage())
    .then(page => {
        return page.goto(url[2]).then(function () {
            return page.content();
        });
    })
    .then(html => {
        const $ = cheerio.load(html);
        let voiceId = 'Justin';
        let story = [];
        let title = $("body h1").text().trim();
        story.push('<speak>');
        let mediumStoryArticle = ['The Title of this medium article is', '<prosody volume=\"loud\">' + title + '</prosody>', 'read by ' + voiceId + '<break strength="strong"/>'].join(' ');
        story.push(mediumStoryArticle);
        $("p").map((_, element) => {
            let text = $(element).text();
            if (text.trim() !== 'Written by') {
                story.push($(element).text());
            }
        });
        story.push('</speak>');
        let params = {
            'Text': story.join(' '),
            'OutputFormat': 'pcm',
            'VoiceId': voiceId,
            'TextType': 'ssml'
        };
        console.log(params);
        textToSpeechConverter(params, {});
    })
    .catch(console.error);

Kết luận

Chuyển văn bản thành giọng nói đã đi một chặng đường dài so với cách đây vài năm trước. Với việc sử dụng deep learning, không dễ dàng nhận ra khác biệt giữa máy móc và con người. Chuyển văn bản thành giọng nói giúp bạn tạo các ứng dụng linh hoạt hơn, dễ tiếp cận hơn.

Tham khaor thêm về NodeJS : 4 module hữu ích được tích hợp sẵn hữu ích

Tham khảo thêm về React: Cách xây dựng Micro Frontend với React


Like it? Share with your friends!

1063
1.6k share, 1063 points

What's Your Reaction?

hate hate
0
hate
confused confused
0
confused
fail fail
0
fail
fun fun
0
fun
geeky geeky
0
geeky
love love
0
love
lol lol
0
lol
omg omg
0
omg
win win
1
win