VoiceStreamAI เป็นเซิร์ฟเวอร์ที่ใช้ Python 3 และโซลูชันไคลเอนต์ JavaScript ที่ช่วยให้สามารถสตรีมเสียงและการถอดเสียงแบบเรียลไทม์ได้โดยใช้ WebSocket ระบบใช้การตรวจจับกิจกรรมด้วยเสียง (VAD) ของ Huggingface และโมเดล Whisper ของ OpenAI (ค่าเริ่มต้นคือกระซิบเร็วกว่า) เพื่อการรู้จำและประมวลผลคำพูดที่แม่นยำ
สิ่งนี้จะไม่แนะนำคุณโดยละเอียดเกี่ยวกับวิธีใช้ CUDA ใน docker ดูตัวอย่างที่นี่
นี่เป็นคำสั่งสำหรับ Linux:
distribution= $( . /etc/os-release ; echo $ID$VERSION_ID )
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
&& curl -s -L https://nvidia.github.io/libnvidia-container/ $distribution /libnvidia-container.list |
sed ' s#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g ' |
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
คุณสามารถสร้างอิมเมจคอนเทนเนอร์ได้ด้วย:
sudo docker build -t VoiceStreamAI .
หลังจากได้รับโทเค็น VAD ของคุณแล้ว (ดูหัวข้อถัดไป) ให้เรียกใช้:
sudo docker volume create huggingface_models
sudo docker run --gpus all -p 8765:8765 -v huggingface_models:/root/.cache/huggingface -e PYANNOTE_AUTH_TOKEN= ' VAD_TOKEN_HERE ' VoiceStreamAI
สิ่งที่ "ปริมาตร" จะช่วยให้คุณไม่ต้องดาวน์โหลดโมเดล Huggingface ใหม่ทุกครั้งที่คุณเรียกใช้คอนเทนเนอร์อีกครั้ง หากคุณไม่ต้องการสิ่งนี้ เพียงใช้:
sudo docker run --gpus all -p 8765:8765 -e PYANNOTE_AUTH_TOKEN= ' VAD_TOKEN_HERE ' VoiceStreamAI
หากต้องการตั้งค่าเซิร์ฟเวอร์ VoiceStreamAI คุณต้องมี Python 3.8 ขึ้นไปและมีแพ็คเกจต่อไปนี้:
transformers
pyannote.core
pyannote.audio
websockets
asyncio
sentence-transformers
faster-whisper
ติดตั้งแพ็คเกจเหล่านี้โดยใช้ pip:
pip install -r requirements.txt
สำหรับฝั่งไคลเอ็นต์ คุณต้องมีเว็บเบราว์เซอร์สมัยใหม่ที่รองรับ JavaScript
เซิร์ฟเวอร์ VoiceStreamAI สามารถปรับแต่งได้ผ่านอาร์กิวเมนต์บรรทัดคำสั่ง ซึ่งช่วยให้คุณสามารถระบุการตั้งค่าส่วนประกอบ โฮสต์ และพอร์ตได้ตามความต้องการของคุณ
--vad-type
: ระบุประเภทของไปป์ไลน์ Voice Activity Detection (VAD) ที่จะใช้ (ค่าเริ่มต้น: pyannote
)--vad-args
: สตริง JSON ที่มีอาร์กิวเมนต์เพิ่มเติมสำหรับไปป์ไลน์ VAD (จำเป็นสำหรับ pyannote
: '{"auth_token": "VAD_AUTH_HERE"}'
)--asr-type
: ระบุประเภทของไปป์ไลน์การรู้จำเสียงอัตโนมัติ (ASR) ที่จะใช้ (ค่าเริ่มต้น: faster_whisper
)--asr-args
: สตริง JSON ที่มีอาร์กิวเมนต์เพิ่มเติมสำหรับไปป์ไลน์ ASR (เช่น เปลี่ยน model_name
สำหรับกระซิบ)--host
: ตั้งค่าที่อยู่โฮสต์สำหรับเซิร์ฟเวอร์ WebSocket (ค่าเริ่มต้น: 127.0.0.1
)--port
: ตั้งค่าพอร์ตที่เซิร์ฟเวอร์รับฟัง (ค่าเริ่มต้น: 8765
)--certfile
: เส้นทางไปยังใบรับรอง SSL (ไฟล์ใบรับรอง) หากใช้ websockets ที่ปลอดภัย (ค่าเริ่มต้น: None
)--keyfile
: เส้นทางไปยังไฟล์คีย์ SSL หากใช้เว็บซ็อกเก็ตที่ปลอดภัย (ค่าเริ่มต้น: None
)สำหรับการรันเซิร์ฟเวอร์ด้วยการกำหนดค่ามาตรฐาน:
python3 -m src.main --vad-args ' {"auth_token": "vad token here"} '
คุณสามารถดูตัวเลือกบรรทัดคำสั่งทั้งหมดได้ด้วยคำสั่ง:
python3 -m src.main --help
client/index.html
ในเว็บเบราว์เซอร์ws://localhost:8765
)สามารถขยายทั้งส่วนประกอบ VAD และ ASR ได้อย่างง่ายดายเพื่อผสานรวมเทคนิคใหม่ๆ และใช้โมเดลที่มีอินเทอร์เฟซที่แตกต่างจากไปป์ไลน์ HuggingFace คุณสามารถเพิ่มกลยุทธ์การประมวลผล/การแบ่งส่วนใหม่ใน server.py และใช้โดยไคลเอนต์เฉพาะที่ตั้งค่าคีย์ "processing_strategy" ในการกำหนดค่า
การตรวจจับกิจกรรมด้วยเสียง (VAD) ใน VoiceStreamAI ช่วยให้ระบบสามารถแยกความแตกต่างระหว่างส่วนที่เป็นคำพูดและส่วนที่ไม่ใช่คำพูดภายในสตรีมเสียง วัตถุประสงค์หลักของการนำ VAD ไปใช้คือการเพิ่มประสิทธิภาพและความแม่นยำของกระบวนการแปลงคำพูดเป็นข้อความ:
VoiceStreamAI ใช้โมเดล Huggingface VAD เพื่อรับรองการตรวจจับคำพูดที่เชื่อถือได้ในสภาพเสียงที่หลากหลาย
กลยุทธ์การบัฟเฟอร์ได้รับการออกแบบมาเพื่อสร้างสมดุลระหว่างการประมวลผลแบบใกล้เรียลไทม์และรับประกันการบันทึกส่วนเสียงพูดที่สมบูรณ์และแม่นยำ ต่อไปนี้คือวิธีการจัดการบัฟเฟอร์:
ใน VoiceStreamAI ไคลเอนต์แต่ละรายสามารถมีการกำหนดค่าเฉพาะที่ปรับแต่งกระบวนการถอดเสียงให้ตรงกับความต้องการเฉพาะของพวกเขา การตั้งค่าส่วนบุคคลนี้ทำได้ผ่านระบบส่งข้อความที่ไคลเอนต์ JavaScript ส่งรายละเอียดการกำหนดค่าไปยังเซิร์ฟเวอร์ Python ส่วนนี้อธิบายวิธีการจัดโครงสร้างและส่งการกำหนดค่าเหล่านี้
การกำหนดค่าไคลเอ็นต์สามารถรวมพารามิเตอร์ต่างๆ ได้ เช่น การกำหนดลักษณะภาษา ความยาวชิ้นข้อมูล และออฟเซ็ตชิ้นข้อมูล ตัวอย่างเช่น:
language
: ระบุภาษาสำหรับการถอดเสียง หากตั้งค่าเป็นอย่างอื่นที่ไม่ใช่ "หลายภาษา" ระบบจะบังคับให้การอนุมาน Whisper เป็นภาษานั้นprocessing_strategy
: ระบุประเภทของการประมวลผลสำหรับไคลเอ็นต์นี้ ซึ่งเป็นรูปแบบกลยุทธ์ประเภทหนึ่ง กลยุทธ์ในตอนนี้ไม่ได้ใช้ OOP แต่มีการนำไปใช้ใน if/else ใน server.pychunk_length_seconds
: กำหนดความยาวของแต่ละส่วนของเสียงที่จะประมวลผลchunk_offset_seconds
: กำหนดเวลาเงียบเมื่อสิ้นสุดแต่ละอันที่จำเป็นในการประมวลผลเสียง (ใช้โดยprocessing_strategy nr 1)การเริ่มต้น : เมื่อไคลเอนต์เริ่มต้นการเชื่อมต่อกับเซิร์ฟเวอร์ ก็สามารถเลือกส่งข้อความการกำหนดค่าได้ ข้อความนี้เป็นออบเจ็กต์ JSON ที่มีคู่คีย์-ค่าซึ่งแสดงถึงการตั้งค่าที่ไคลเอ็นต์ต้องการ
การตั้งค่าไคลเอนต์ JavaScript : บนไคลเอนต์สาธิต การกำหนดค่าจะถูกรวบรวมจากองค์ประกอบอินเทอร์เฟซผู้ใช้ (เช่น รายการแบบเลื่อนลงและช่องป้อนข้อมูล) เมื่อเสียงเริ่มไหล ออบเจ็กต์ JSON จะถูกสร้างขึ้นและส่งไปยังเซิร์ฟเวอร์ผ่าน WebSocket ตัวอย่างเช่น:
function sendAudioConfig ( ) {
const audioConfig = {
type : "config" ,
data : {
chunk_length_seconds : 5 ,
chunk_offset_seconds : 1 ,
processing_strategy : 1 ,
language : language ,
} ,
} ;
websocket . send ( JSON . stringify ( audioConfig ) ) ;
}
เมื่อใช้ ASR, Vad หรือ Buffering Strategy ใหม่ คุณสามารถทดสอบได้ด้วย:
pip install -r requirements-dev.txt
export PYANNOTE_AUTH_TOKEN= < VAD_TOKEN_HERE >
ASR_TYPE=faster_whisper python -m unittest test.server.test_server
โปรดตรวจสอบให้แน่ใจว่าตัวแปรสุดท้ายอยู่ในตำแหน่งแล้ว เช่น สำหรับโทเค็นการตรวจสอบสิทธิ์ VAD มีการทดสอบอื่นๆ อีกหลายประการ เช่น สำหรับ ASR แบบสแตนด์อโลน
ปัจจุบัน VoiceStreamAI ประมวลผลเสียงโดยบันทึกเป็นไฟล์แล้วเรียกใช้ไฟล์เหล่านี้ผ่านโมเดลต่างๆ
แยกและโคลนที่เก็บนี้ ติดตั้งการขึ้นต่อกันและเครื่องมือที่เกี่ยวข้อง
pip install -r requirements.txt
pip install -r requirements-dev.txt
npm install -g [email protected] [email protected]
เพิ่มการแก้ไขของคุณไปยังพื้นที่เก็บข้อมูลและรันการตรวจสอบสไตล์โค้ดด้วยตนเอง หรือรวมเข้ากับ IDE/เอดิเตอร์ของคุณ
# For Python
flake8 src/ test/
black --line-length 79 src/ test/
isort src/ test/
# For JavaScript
jshint client/ * .js
eslint client/ * .js
สุดท้าย ผลักดันและสร้างคำขอดึง
โครงการนี้เปิดให้มีส่วนร่วม อย่าลังเลที่จะแยกพื้นที่เก็บข้อมูลและส่งคำขอดึง