由于身臨其境的體驗,虛擬現實( VR )、增強現實( AR )和混合現實( MR )環境可以感覺到難以置信的真實。在擴展現實( XR )應用程序中添加基于語音的界面可以使其看起來更真實。
想象一下,用你的聲音在一個環境中導航,或者發出口頭命令,然后聽到虛擬實體的回應。
在 XR 環境中利用 speech AI 的可能性非常誘人。語音人工智能技能,如自動語音識別( ASR )和文本到語音轉換( TTS ),使 XR 應用程序變得有趣、易于使用,并使有語音障礙的用戶更容易使用。
本文介紹了如何在 XR 應用程序中使用語音識別,也稱為語音到文本( STT ),有哪些 ASR 自定義,以及如何開始在 Windows 應用程序中運行 ASR 服務。
為什么要在 XR 應用程序中添加語音 AI 服務?
在當今大多數 XR 體驗中,用戶無法使用鍵盤或鼠標。 VR 游戲控制器通常與虛擬體驗交互的方式既笨拙又不直觀,當您沉浸在環境中時,很難通過菜單進行導航。
當我們沉浸在虛擬世界中時,我們希望我們的體驗感覺自然,無論是我們如何感知它,還是我們如何與它互動。言語是我們在現實世界中最常見的交流方式之一。
在 XR 應用程序中添加支持語音 AI 的語音命令和響應,使交互更加自然,并大大簡化了用戶的學習曲線。
支持語音 AI 的 XR 應用程序示例
如今,有各種各樣的可穿戴技術設備,使人們能夠在使用聲音的同時體驗身臨其境的現實:
AR 翻譯眼鏡可以在 AR 中提供實時翻譯,或者只在 AR 中轉錄語音,以幫助有聽力障礙的人。
品牌化語音是為元宇宙中的數字化身定制和開發的,使體驗更加可信和真實。
社交媒體平臺提供語音激活 AR 過濾器,便于搜索和使用。例如, Snapchat 用戶可以使用免提語音掃描功能搜索所需的數字濾波器。
VR 設計審查
虛擬現實可以幫助企業通過自動化汽車行業的許多任務來節省成本,例如汽車建模、裝配工人培訓和駕駛模擬。
添加的語音 AI 組件使免提交互成為可能。例如,用戶可以利用 STT 技能向 VR 應用程序發出命令,應用程序可以通過 TTS 以聽起來很人性化的方式響應。
圖 1.VR 汽車設計審查工作流架構
如圖 1 所示,用戶向 VR 應用程序發送音頻請求,然后使用 ASR 將其轉換為文本。自然語言理解將文本作為輸入并生成響應,然后使用 TTS 將其反饋給用戶。
開發語音 AI 管道并不像聽起來那么容易。傳統上,在構建管道時,總是要在準確性和實時響應之間進行權衡。
這篇文章只關注 ASR ,我們研究了目前 XR 應用程序開發人員可用的一些定制。我們還討論了使用 GPU 加速語音 AI SDK NVIDIA Riva 構建針對特定用例定制的應用程序,同時提供實時性能。
通過 ASR 定制解決特定領域和語言的挑戰
一個 ASR 管道包括一個特征抽取器、聲學模型、解碼器或語言模型以及標點符號和大寫模型(圖 2 )。
圖 2.ASR 管道
要了解可用的 ASR 定制,掌握端到端流程很重要。首先,進行特征提取,將原始音頻波形轉換為頻譜圖/梅爾頻譜圖。然后將這些頻譜圖輸入聲學模型,該模型生成一個矩陣,其中包含每個時間步長的所有字符的概率。
接下來,解碼器與語言模型一起使用該矩陣作為輸入來生成文本。然后,您可以通過標點符號和大寫模型運行生成的文本,以提高可讀性。
高級語音 AI SDK 和工作流(如 Riva )支持語音識別管道定制。自定義可幫助您解決一些特定于語言的挑戰,例如了解以下一項或多項:
多重口音
單詞語境化
領域專用術語
多種方言
多種語言
噪音環境中的用戶
Riva 中的定制可以應用于訓練和推理階段。從培訓級別定制開始,您可以微調聲學模型、解碼器/語言模型以及標點符號和大寫模型。這可以確保您的管道能夠理解不同的語言、方言、口音和行業特定的行話,并且對噪音具有魯棒性。
當涉及到推理級自定義時,可以使用 word boosting 。通過單詞增強,在解碼聲學模型的輸出時, ASR 管道更可能通過給某些感興趣的單詞更高的分數來識別它們。
開始使用 NVIDIA Riva 為 XR 開發集成 ASR 服務
Riva 作為客戶機 – 服務器模型運行。要運行 Riva ,您需要訪問帶有 NVIDIA GPU 的 Linux 服務器,在那里您可以安裝和運行 Riva 服務器(本文提供了詳細信息和說明)。
Riva 客戶端 API 集成到 Windows 應用程序中。在運行時, Windows 客戶端通過網絡向 Riva 服務器發送 Riva 請求,而[ZDK0 :服務器則發送回復。單個 Riva 服務器可以同時支持多個 Riva 客戶端。
ASR 服務可以在兩種不同的模式下運行:
Offline mode: 捕獲完整的語音段,完成后發送到 Riva 以轉換為文本。
Streaming mode: 語音片段正在實時流式傳輸到 Riva 服務器,文本結果正在實時流回。流模式有點復雜,因為它需要多個線程。
本文稍后將提供兩種模式的示例。
在本節中,您將學習幾種將 Riva 集成到 Windows 應用程序中的方法:
Python ASR 離線客戶端
Python 流式 ASR 客戶端
使用 Docker 的 C ++脫機客戶端
C ++流媒體客戶端
首先,這里介紹了如何設置和運行 Riva 服務器。
先決條件
訪問 NGC 。有關分步說明,請參閱 NGC Getting Started Guide
執行所有步驟,以便能夠從命令行界面( CLI )運行ngc命令。
訪問 NVIDIA Volta 、 NVIDIA -Turing 或基于 A100 GPU 的 NVIDIA 安培架構。帶有 NVIDIA GPU 的 Linux 服務器也可從主要 CSP 獲得。有關更多信息,請參閱 support matrix 。
Docker 安裝,支持 NVIDIA GPU 。
按照說明安裝 NVIDIA Container Toolkit ,然后安裝nvidia-docker軟件包。
服務器設置
通過運行以下命令從 NGC 下載腳本:
ngc registry resource download-version nvidia/riva/riva_quickstart:2.4.0
初始化 Riva 服務器:
bash riva_init.sh
啟動 Riva 服務器:
bash riva_start.sh
運行 Python ASR 脫機客戶端
首先,運行以下命令來安裝riva客戶端軟件包。確保您使用的是 Python 版本 3.7 。
pip install nvidia-riva-client
以下代碼示例以脫機模式運行 ASR 轉錄。您必須更改服務器地址,給出要轉錄的音頻文件的路徑,并選擇語言代碼。目前, Riva 支持英語、西班牙語、德語、俄語和普通話。
import io import IPython.display as ipd import grpc import riva.client auth = riva.client.Auth(uri='server address:port number') riva_asr = riva.client.ASRService(auth) # Supports .wav file in LINEAR_PCM encoding, including .alaw, .mulaw, and .flac formats with single channel # read in an audio file from local disk path = "audio file path" with io.open(path, 'rb') as fh: content = fh.read() ipd.Audio(path) # Set up an offline/batch recognition request config = riva.client.RecognitionConfig() #req.config.encoding = ra.AudioEncoding.LINEAR_PCM # Audio encoding can be detected from wav #req.config.sample_rate_hertz = 0 # Sample rate can be detected from wav and resampled if needed config.language_code = "en-US" # Language code of the audio clip config.max_alternatives = 1 # How many top-N hypotheses to return config.enable_automatic_punctuation = True # Add punctuation when end of VAD detected config.audio_channel_count = 1 # Mono channel response = riva_asr.offline_recognize(content, config) asr_best_transcript = response.results[0].alternatives[0].transcript print("ASR Transcript:", asr_best_transcript) print("\n\nFull Response Message:") print(response)
運行 Python 流式 ASR 客戶端
要運行 ASR 流客戶端,請克隆riva python-clients存儲庫并運行存儲庫附帶的文件。
要使 ASR 流式處理客戶端在 Windows 上運行,請運行以下命令克隆存儲庫:
git clone https://github.com/nvidia-riva/python-clients.git
從python-clients/scripts/asr
文件夾運行以下命令:
python transcribe_mic.py --server=server address:port number
下面是 transcibe_mic.py :
import argparse import riva.client from riva.client.argparse_utils import add_asr_config_argparse_parameters, add_connection_argparse_parameters import riva.client.audio_io def parse_args() -> argparse.Namespace: default_device_info = riva.client.audio_io.get_default_input_device_info() default_device_index = None if default_device_info is None else default_device_info['index'] parser = argparse.ArgumentParser( description="Streaming transcription from microphone via Riva AI Services", formatter_class=argparse.ArgumentDefaultsHelpFormatter, ) parser.add_argument("--input-device", type=int, default=default_device_index, help="An input audio device to use.") parser.add_argument("--list-devices", action="store_true", help="List input audio device indices.") parser = add_asr_config_argparse_parameters(parser, profanity_filter=True) parser = add_connection_argparse_parameters(parser) parser.add_argument( "--sample-rate-hz", type=int, help="A number of frames per second in audio streamed from a microphone.", default=16000, ) parser.add_argument( "--file-streaming-chunk", type=int, default=1600, help="A maximum number of frames in a audio chunk sent to server.", ) args = parser.parse_args() return args def main() -> None: args = parse_args() if args.list_devices: riva.client.audio_io.list_input_devices() return auth = riva.client.Auth(args.ssl_cert, args.use_ssl, args.server) asr_service = riva.client.ASRService(auth) config = riva.client.StreamingRecognitionConfig( config=riva.client.RecognitionConfig( encoding=riva.client.AudioEncoding.LINEAR_PCM, language_code=args.language_code, max_alternatives=1, profanity_filter=args.profanity_filter, enable_automatic_punctuation=args.automatic_punctuation, verbatim_transcripts=not args.no_verbatim_transcripts, sample_rate_hertz=args.sample_rate_hz, audio_channel_count=1, ), interim_results=True, ) riva.client.add_word_boosting_to_config(config, args.boosted_lm_words, args.boosted_lm_score) with riva.client.audio_io.MicrophoneStream( args.sample_rate_hz, args.file_streaming_chunk, device=args.input_device, ) as audio_chunk_iterator: riva.client.print_streaming( responses=asr_service.streaming_response_generator( audio_chunks=audio_chunk_iterator, streaming_config=config, ), show_intermediate=True, ) if __name__ == '__main__': main()
使用 Docker 運行 C ++ ASR 脫機客戶端
下面是如何在 C ++中使用 Docker 運行 Riva ASR 脫機客戶端。
通過運行以下命令克隆/ cpp 客戶端 GitHub 存儲庫:
git clone https://github.com/nvidia-riva/cpp-clients.git
構建 Docker 映像:
DOCKER_BUILDKIT=1 docker build . –tag riva-client
運行 Docker 映像:
docker run -it --net=host riva-client
啟動 Riva 語音識別客戶端:
Riva_asr_client –riva_url server address:port number –audio_file audio_sample
運行 C ++ ASR 流式處理客戶端
要在 C ++中運行 ASR 流式客戶端riva_asr,必須首先編譯 cpp sample 。在滿足以下依賴項之后,使用 CMake 很簡單:
gflags
glog
grpc
rtaudio
rapidjson
protobuf
grpc_cpp_plugin
在根源文件夾中創建文件夾/build。在終端上,鍵入cmake 。.,然后鍵入make。有關詳細信息,請參閱存儲庫中包含的自述文件。
編譯樣本后,輸入以下命令運行它:
riva_asr.exe --riva_uri={riva server url}:{riva server port} --audio_device={Input device name, e.g. "plughw:PCH,0"}
-
riva_uri
:riva
服務器的address:port
值。默認情況下,riva
服務器偵聽端口 50051 。 -
audio_device
:要使用的輸入設備(麥克風)。
該示例實際上實現了四個步驟。這篇文章中只展示了幾個簡短的例子。有關詳細信息,請參閱文件streaming_recognize_client.cc
。
使用命令行中指定的輸入(麥克風)設備打開輸入流。在這種情況下,您使用的是每秒 16K 采樣和 16 位采樣的一個通道。
int StreamingRecognizeClient::DoStreamingFromMicrophone(const std::string& audio_device, bool& request_exit) { nr::AudioEncoding encoding = nr::LINEAR_PCM; adc.setErrorCallback(rtErrorCallback); RtAudio::StreamParameters parameters; parameters.nChannels = 1; parameters.firstChannel = 0; unsigned int sampleRate = 16000; unsigned int bufferFrames = 1600; // (0.1 sec of rec) sample frames RtAudio::StreamOptions streamOptions; streamOptions.flags = RTAUDIO_MINIMIZE_LATENCY; … RtAudioErrorType error = adc.openStream( nullptr, ¶meters, RTAUDIO_SINT16, sampleRate, &bufferFrames, &MicrophoneCallbackMain, static_cast(&uData), &streamOptions);
使用.proto 文件指定的協議 api 接口(在文件夾riva/proto
的源中)打開與 Riva 服務器的grpc
通信通道:
int StreamingRecognizeClient::DoStreamingFromMicrophone(const std::string& audio_device, bool& request_exit) { … std::shared_ptrcall = std::make_shared (1, word_time_offsets_); call->streamer = stub_->StreamingRecognize(&call->context); // Send first request nr_asr::StreamingRecognizeRequest request; auto streaming_config = request.mutable_streaming_config(); streaming_config->set_interim_results(interim_results_); auto config = streaming_config->mutable_config(); config->set_sample_rate_hertz(sampleRate); config->set_language_code(language_code_); config->set_encoding(encoding); config->set_max_alternatives(max_alternatives_); config->set_audio_channel_count(parameters.nChannels); config->set_enable_word_time_offsets(word_time_offsets_); config->set_enable_automatic_punctuation(automatic_punctuation_); config->set_enable_separate_recognition_per_channel(separate_recognition_per_channel_); config->set_verbatim_transcripts(verbatim_transcripts_); if (model_name_ != "") { config->set_model(model_name_); } call->streamer->Write(request);
開始發送麥克風通過grpc
消息接收到的音頻數據到riva
:
static int MicrophoneCallbackMain( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData )
通過服務器的grpc
應答接收轉錄的音頻:
void StreamingRecognizeClient::ReceiveResponses(std::shared_ptrcall, bool audio_device) { … while (call->streamer->Read(&call->response)) { // Returns false when no m ore to read. call->recv_times.push_back(std::chrono::steady_clock::now()); // Reset the partial transcript call->latest_result_.partial_transcript = ""; call->latest_result_.partial_time_stamps.clear(); bool is_final = false; for (int r = 0; r < call->response.results_size(); ++r) { const auto& result = call->response.results(r); if (result.is_final()) { is_final = true; } … call->latest_result_.audio_processed = result.audio_processed(); if (print_transcripts_) { call->AppendResult(result); } } if (call->response.results_size() && interim_results_ && print_transcripts_) { std::cout << call->latest_result_.final_transcripts[0] + call->latest_result_.partial_transcript << std::endl; } call->recv_final_flags.push_back(is_final); }
開發語音 AI 應用程序的資源
通過識別你的聲音或執行命令,語音人工智能正在從在聯絡中心授權實際人類擴展到在元宇宙授權數字人類。
關于作者
Sirisha Rella 是 NVIDIA 的技術產品營銷經理,專注于計算機視覺、語音和基于語言的深度學習應用。 Sirisha 獲得了密蘇里大學堪薩斯城分校的計算機科學碩士學位,是國家科學基金會大學習中心的研究生助理。
Davide Onofrio 是 NVIDIA 的高級深度學習軟件技術營銷工程師。他在 NVIDIA 專注于深度學習技術開發人員關注內容的開發和演示。戴維德在生物特征識別、虛擬現實和汽車行業擔任計算機視覺和機器學習工程師已有多年經驗。
審核編輯:郭婷
-
NVIDIA
+關注
關注
14文章
4990瀏覽量
103118 -
AI
+關注
關注
87文章
30947瀏覽量
269213 -
vr
+關注
關注
34文章
9640瀏覽量
150313
發布評論請先 登錄
相關推薦
評論