AI với Python – Nhận dạng giọng nói

Lời nói là phương tiện giao tiếp cơ bản nhất của con người trưởng thành. Mục tiêu cơ bản của xử lý giọng nói là cung cấp sự tương tác giữa con người và máy móc.

Hệ thống xử lý giọng nói chủ yếu có ba nhiệm vụ –

  • Đầu tiên , nhận dạng giọng nói cho phép máy bắt được các từ, cụm từ và câu mà chúng ta nói
  • Thứ hai , xử lý ngôn ngữ tự nhiên để cho phép máy hiểu những gì chúng ta nói và
  • Thứ ba , tổng hợp giọng nói để cho phép máy nói.

Chương này tập trung vào nhận dạng giọng nói , quá trình hiểu các từ được nói bởi con người. Hãy nhớ rằng các tín hiệu giọng nói được ghi lại với sự trợ giúp của micrô và sau đó hệ thống phải hiểu tín hiệu đó.

Xây dng b nhn dng ging nói

Nhận dạng giọng nói hoặc Nhận dạng giọng nói tự động (ASR) là trung tâm chú ý của các dự án AI như rô-bốt. Không có ASR, không thể tưởng tượng một robot nhận thức tương tác với con người. Tuy nhiên, việc xây dựng một bộ nhận dạng giọng nói không phải là điều dễ dàng.

Khó khăn trong vic phát trin mt h thng nhn dng ging nói

Phát triển một hệ thống nhận dạng giọng nói chất lượng cao thực sự là một bài toán khó. Khó khăn của công nghệ nhận dạng giọng nói có thể được mô tả rộng rãi theo một số khía cạnh như được thảo luận bên dưới –

  • Kích thước của từ vựng – Kích thước của từ vựng ảnh hưởng đến việc dễ dàng phát triển ASR. Hãy xem xét các kích thước từ vựng sau đây để hiểu rõ hơn.
    • Ví dụ, một từ vựng có kích thước nhỏ bao gồm 2-100 từ, như trong hệ thống menu bằng giọng nói
    • Ví dụ, một từ vựng có kích thước trung bình bao gồm vài từ 100 đến 1.000 từ, như trong tác vụ truy xuất cơ sở dữ liệu
    • Một kho từ vựng kích thước lớn bao gồm khoảng 10.000 từ, như trong một nhiệm vụ đọc chính tả chung.

Lưu ý rằng, kích thước từ vựng càng lớn thì việc nhận dạng càng khó thực hiện.

  • Đặc điểm kênh – Chất lượng kênh cũng là một khía cạnh quan trọng. Ví dụ: giọng nói của con người chứa băng thông cao với dải tần số đầy đủ, trong khi giọng nói qua điện thoại bao gồm băng thông thấp với dải tần số hạn chế. Lưu ý rằng nó khó hơn ở phần sau.
  • Chế độ nói – Việc dễ dàng phát triển ASR cũng phụ thuộc vào chế độ nói, đó là liệu bài phát biểu ở chế độ từ riêng biệt hay chế độ từ được kết nối hay ở chế độ phát biểu liên tục. Lưu ý rằng một bài phát biểu liên tục khó nhận ra hơn.
  • Phong cách nói − Một bài phát biểu đã đọc có thể theo phong cách trang trọng, hoặc tự phát và đối thoại theo phong cách thông thường. Cái sau khó nhận ra hơn.
  • Sự phụ thuộc của người nói – Bài phát biểu có thể phụ thuộc vào người nói, thích nghi với người nói hoặc độc lập với người nói. Một loa độc lập là khó xây dựng nhất.
  • Loại tiếng ồn – Tiếng ồn là một yếu tố khác cần xem xét khi phát triển ASR. Tỷ lệ tín hiệu trên tạp âm có thể ở nhiều phạm vi khác nhau, tùy thuộc vào môi trường âm thanh quan sát được ít tiếng ồn xung quanh hơn so với nhiều tiếng ồn xung quanh −
    • Nếu tỷ lệ tín hiệu trên tạp âm lớn hơn 30dB thì được coi là dải cao
    • Nếu tỷ lệ tín hiệu trên nhiễu nằm trong khoảng từ 30dB đến 10db, thì nó được coi là SNR trung bình
    • Nếu tỷ lệ tín hiệu trên tạp âm nhỏ hơn 10dB, nó được coi là phạm vi thấp

Ví dụ: loại tiếng ồn xung quanh như tiếng ồn cố định, tiếng ồn không phải của con người, lời nói xung quanh và nhiễu xuyên âm của những người nói khác cũng góp phần gây khó khăn cho vấn đề.

  • Đặc điểm của micrô − Chất lượng của micrô có thể tốt, trung bình hoặc dưới mức trung bình. Ngoài ra, khoảng cách giữa miệng và micro có thể thay đổi. Những yếu tố này cũng nên được xem xét cho các hệ thống nhận dạng.

Bất chấp những khó khăn này, các nhà nghiên cứu đã nghiên cứu rất nhiều về các khía cạnh khác nhau của lời nói như hiểu tín hiệu lời nói, người nói và xác định trọng âm.

Bạn sẽ phải làm theo các bước dưới đây để xây dựng trình nhận dạng giọng nói –

Trc quan hóa tín hiu âm thanh – Đọc t mt tp và làm vic trên đó

Đây là bước đầu tiên trong việc xây dựng hệ thống nhận dạng giọng nói vì nó mang lại sự hiểu biết về cách cấu trúc tín hiệu âm thanh. Một số bước phổ biến có thể được thực hiện để làm việc với tín hiệu âm thanh như sau –

ghi âm

Lúc đầu, khi bạn phải đọc tín hiệu âm thanh từ một tệp, sau đó ghi lại bằng micrô.

Ly mu

Khi ghi âm bằng micrô, các tín hiệu được lưu trữ ở dạng số hóa. Nhưng để làm việc với nó, máy cần chúng ở dạng số rời rạc. Do đó, chúng ta nên thực hiện lấy mẫu ở một tần số nhất định và chuyển đổi tín hiệu thành dạng số rời rạc. Việc chọn tần số cao để lấy mẫu ngụ ý rằng khi con người nghe tín hiệu, họ cảm thấy đó là tín hiệu âm thanh liên tục.

Ví d

Ví dụ sau đây cho thấy cách tiếp cận từng bước để phân tích tín hiệu âm thanh, sử dụng Python, tín hiệu này được lưu trữ trong một tệp. Tần số của tín hiệu âm thanh này là 44.100 HZ. Nhập các gói cần thiết như được hiển thị ở đây

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

Bây giờ, hãy đọc tệp âm thanh được lưu trữ. Nó sẽ trả về hai giá trị: tần số lấy mẫu và tín hiệu âm thanh. Cung cấp đường dẫn của tệp âm thanh nơi nó được lưu trữ, như được hiển thị ở đây

frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")

Hiển thị các tham số như tần số lấy mẫu của tín hiệu âm thanh, loại dữ liệu của tín hiệu và thời lượng của nó, bằng cách sử dụng các lệnh được hiển thị

print('\nSignal shape:', audio_signal.shape)
print('Signal Datatype:', audio_signal.dtype)
print('Signal duration:', round(audio_signal.shape[0] / 
float(frequency_sampling), 2), 'seconds')

Bước này liên quan đến việc chuẩn hóa tín hiệu như hình bên dưới –

audio_signal = audio_signal / np.power(2, 15)

Trong bước này, chúng tôi đang trích xuất 100 giá trị đầu tiên từ tín hiệu này để trực quan hóa. Sử dụng các lệnh sau cho mục đích này –

audio_signal = audio_signal [:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(frequency_sampling)

Bây giờ, trực quan hóa tín hiệu bằng cách sử dụng các lệnh dưới đây

plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time (milliseconds)')
plt.ylabel('Amplitude')
plt.title('Input audio signal')
plt.show()

Bạn có thể xem biểu đồ đầu ra và dữ liệu được trích xuất cho tín hiệu âm thanh ở trên như trong hình ở đây

AI với Python – Nhận dạng giọng nói
Signal shape: (132300,)
Signal Datatype: int16
Signal duration: 3.0 seconds

Đặc trưng cho tín hiu âm thanh: Chuyn đổi sang min tn s

Việc mô tả đặc tính của tín hiệu âm thanh liên quan đến việc chuyển đổi tín hiệu miền thời gian thành miền tần số và hiểu các thành phần tần số của tín hiệu đó. Đây là một bước quan trọng vì nó cung cấp nhiều thông tin về tín hiệu. Bạn có thể sử dụng một công cụ toán học như Biến đổi Fourier để thực hiện phép biến đổi này.

Ví d

Ví dụ sau đây cho thấy, từng bước, cách mô tả tín hiệu, sử dụng Python, được lưu trữ trong một tệp. Lưu ý rằng ở đây chúng tôi đang sử dụng công cụ toán học Biến đổi Fourier để chuyển đổi nó thành miền tần số. Nhập các gói cần thiết, như được hiển thị ở đây

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

Bây giờ, hãy đọc tệp âm thanh được lưu trữ. Nó sẽ trả về hai giá trị: tần số lấy mẫu và tín hiệu âm thanh. Cung cấp đường dẫn của tệp âm thanh nơi nó được lưu trữ như được hiển thị trong lệnh tại đây –

frequency_sampling, audio_signal = wavfile.read("/Users/admin/sample.wav")

Trong bước này, chúng tôi sẽ hiển thị các tham số như tần số lấy mẫu của tín hiệu âm thanh, loại dữ liệu của tín hiệu và thời lượng của nó, bằng cách sử dụng các lệnh được cung cấp bên dưới

print('\nSignal shape:', audio_signal.shape)
print('Signal Datatype:', audio_signal.dtype)
print('Signal duration:', round(audio_signal.shape[0] / 
float(frequency_sampling), 2), 'seconds')

Trong bước này, chúng ta cần chuẩn hóa tín hiệu, như thể hiện trong lệnh sau –

audio_signal = audio_signal / np.power(2, 15)

Bước này liên quan đến việc trích xuất độ dài và một nửa độ dài của tín hiệu. Sử dụng các lệnh sau cho mục đích này –

length_signal = len(audio_signal)
half_length = np.ceil((length_signal + 1) / 2.0).astype(np.int)

Bây giờ, chúng ta cần áp dụng các công cụ toán học để chuyển đổi sang miền tần số. Ở đây chúng tôi đang sử dụng Biến đổi Fourier.

Trong bước này, chúng ta cần chuẩn hóa tín hiệu, như thể hiện trong lệnh sau –

audio_signal = audio_signal / np.power(2, 15)

Bước này liên quan đến việc trích xuất độ dài và một nửa độ dài của tín hiệu. Sử dụng các lệnh sau cho mục đích này –

length_signal = len(audio_signal)
half_length = np.ceil((length_signal + 1) / 2.0).astype(np.int)

Bây giờ, chúng ta cần áp dụng các công cụ toán học để chuyển đổi sang miền tần số. Ở đây chúng tôi đang sử dụng Biến đổi Fourier.

signal_frequency = np.fft.fft(audio_signal)

Bây giờ, hãy chuẩn hóa tín hiệu miền tần số và bình phương nó –

signal_frequency = abs(signal_frequency[0:half_length]) / length_signal
signal_frequency **= 2

Tiếp theo, trích xuất độ dài và một nửa độ dài của tín hiệu được biến đổi tần số –

len_fts = len(signal_frequency)

Lưu ý rằng tín hiệu biến đổi Fourier phải được điều chỉnh cho trường hợp chẵn cũng như trường hợp lẻ.

if length_signal % 2:
   signal_frequency[1:len_fts] *= 2
else:
   signal_frequency[1:len_fts-1] *= 2

Bây giờ, giải nén công suất tính bằng decibal(dB) −

signal_power = 10 * np.log10(signal_frequency)

Điều chỉnh tần số theo kHz cho trục X −

x_axis = np.arange(0, len_half, 1) * (frequency_sampling / length_signal) / 1000.0

Bây giờ, hãy hình dung đặc tính của tín hiệu như sau

plt.figure()
plt.plot(x_axis, signal_power, color='black')
plt.xlabel('Frequency (kHz)')
plt.ylabel('Signal power (dB)')
plt.show()

Bạn có thể quan sát biểu đồ đầu ra của đoạn mã trên như trong hình dưới đây

AI với Python – Nhận dạng giọng nói

To tín hiu âm thanh đơn điu

Hai bước mà bạn đã thấy cho đến bây giờ rất quan trọng để tìm hiểu về các tín hiệu. Bây giờ, bước này sẽ hữu ích nếu bạn muốn tạo tín hiệu âm thanh với một số tham số được xác định trước. Lưu ý rằng bước này sẽ lưu tín hiệu âm thanh trong tệp đầu ra.

Ví d

Trong ví dụ sau, chúng ta sẽ tạo tín hiệu đơn điệu, sử dụng Python, tín hiệu này sẽ được lưu trữ trong một tệp. Đối với điều này, bạn sẽ phải thực hiện các bước sau – Nhập các gói cần thiết như được hiển thị

import numpy as np
import matplotlib.pyplot as plt
from scipy.io.wavfile import write

Cung cấp tệp nơi tệp đầu ra sẽ được lưu

output_file = 'audio_signal_generated.wav'

Bây giờ, chỉ định các tham số bạn chọn, như được hiển thị

duration = 4 # in seconds
frequency_sampling = 44100 # in Hz
frequency_tone = 784
min_val = -4 * np.pi
max_val = 4 * np.pi

Trong bước này, chúng ta có thể tạo tín hiệu âm thanh, như được hiển thị

t = np.linspace(min_val, max_val, duration * frequency_sampling)
audio_signal = np.sin(2 * np.pi * tone_freq * t)

Bây giờ, hãy lưu tệp âm thanh trong tệp đầu ra –

write(output_file, frequency_sampling, signal_scaled)
Trích xuất 100 giá trị đầu tiên cho biểu đồ của chúng tôi, như được hiển thị

audio_signal = audio_signal[:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(sampling_freq)

Bây giờ, hãy hình dung tín hiệu âm thanh được tạo như sau

plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time in milliseconds')
plt.ylabel('Amplitude')
plt.title('Generated audio signal')
plt.show()

Bạn có thể quan sát cốt truyện như trong hình được đưa ra ở đây

AI với Python – Nhận dạng giọng nói

Trích xut tính năng t li nói

Đây là bước quan trọng nhất trong việc xây dựng bộ nhận dạng tiếng nói vì sau khi chuyển đổi tín hiệu tiếng nói sang miền tần số, chúng ta phải chuyển đổi nó thành dạng vectơ đặc trưng có thể sử dụng được. Chúng tôi có thể sử dụng các kỹ thuật trích xuất tính năng khác nhau như MFCC, PLP, PLP-RASTA, v.v. cho mục đích này.

Ví dụ

Trong ví dụ sau, chúng tôi sẽ trích xuất các tính năng từ tín hiệu, từng bước, sử dụng Python, bằng cách sử dụng kỹ thuật MFCC. Nhập các gói cần thiết, như được hiển thị ở đây

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from python_speech_features import mfcc, logfbank

Bây giờ, hãy đọc tệp âm thanh được lưu trữ. Nó sẽ trả về hai giá trị – tần số lấy mẫu và tín hiệu âm thanh. Cung cấp đường dẫn của tệp âm thanh nơi nó được lưu trữ.

frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")

Lưu ý rằng ở đây chúng tôi đang lấy 15000 mẫu đầu tiên để phân tích.

audio_signal = audio_signal[:15000]

Sử dụng các kỹ thuật MFCC và thực hiện lệnh sau để trích xuất các tính năng của MFCC –

features_mfcc = mfcc(audio_signal, frequency_sampling)

Bây giờ, in các tham số MFCC, như được hiển thị

print('\nMFCC:\nNumber of windows =', features_mfcc.shape[0])
print('Length of each feature =', features_mfcc.shape[1])

Bây giờ, hãy vẽ đồ thị và trực quan hóa các tính năng của MFCC bằng cách sử dụng các lệnh dưới đây

features_mfcc = features_mfcc.T
plt.matshow(features_mfcc)
plt.title('MFCC')

Trong bước này, chúng tôi làm việc với các tính năng ngân hàng bộ lọc như được hiển thị –

Trích xuất các tính năng ngân hàng bộ lọc –

filterbank_features = logfbank(audio_signal, frequency_sampling)

Bây giờ, in các tham số ngân hàng bộ lọc.

print('\nFilter bank:\nNumber of windows =', filterbank_features.shape[0])
print('Length of each feature =', filterbank_features.shape[1])

Bây giờ, vẽ sơ đồ và trực quan hóa các tính năng của ngân hàng bộ lọc.

filterbank_features = filterbank_features.T
plt.matshow(filterbank_features)
plt.title('Filter bank')
plt.show()

Kết quả của các bước trên, bạn có thể quan sát các đầu ra sau: Hình 1 cho MFCC và Hình 2 cho Ngân hàng Bộ lọc

AI với Python – Nhận dạng giọng nói
AI với Python – Nhận dạng giọng nói

Nhn biết các t được nói

Nhận dạng giọng nói có nghĩa là khi con người đang nói, một chiếc máy sẽ hiểu nó. Ở đây chúng tôi đang sử dụng Google Speech API bằng Python để thực hiện điều đó. Chúng ta cần cài đặt các gói sau cho việc này –

  • Pyaudio – Nó có thể được cài đặt bằng cách sử dụng lệnh pip install Pyaudio .
  • SpeechRecognition − Gói này có thể được cài đặt bằng cách sử dụng pip install SpeechRecognition.
  • Google-Speech-API − Nó có thể được cài đặt bằng cách sử dụng lệnh pip install google-api-python-client .

Ví d

Quan sát ví dụ sau để hiểu về nhận dạng lời nói –

Nhập các gói cần thiết như được hiển thị –

import speech_recognition as sr

Tạo một đối tượng như hình dưới đây –

recording = sr.Recognizer()

Bây giờ, mô-đun Micrô () sẽ lấy giọng nói làm đầu vào

with sr.Microphone() as source: recording.adjust_for_ambient_noise(source)
   print("Please Say something:")
   audio = recording.listen(source)

Giờ đây, API của Google sẽ nhận dạng giọng nói và đưa ra đầu ra.

try:
   print("You said: \n" + recording.recognize_google(audio))
except Exception as e:
print(e)

Bạn có thể thấy đầu ra sau –

Please Say Something:
You said:

Ví dụ: nếu bạn nói dongthoigian.net , thì hệ thống sẽ nhận ra nó một cách chính xác như sau – Dongthoigian.net

Xem thêm : AI với Python – Tìm kiếm theo kinh nghiệm

Trả lời