2 คะแนน โดย GN⁺ 2023-11-03 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Talk-Llama เป็นตัวอย่างของ whisper.cpp ที่เมื่อพูดผ่านไมโครโฟนในเทอร์มินัล Whisper จะแปลงเสียงเป็นข้อความ และ LLaMA จะตอบกลับ
  • การจับเสียงจากไมโครโฟนต้องใช้ SDL2 และตอน build ต้องเปิดตัวเลือก CMake WHISPER_SDL2=ON
  • ตอนรันให้ระบุ โมเดล Whisper ด้วย -mw โดยสำหรับการสนทนาแบบเรียลไทม์แนะนำโมเดล base หรือ small
  • สำหรับ -ml ให้ระบุ โมเดล LLaMA ที่เข้ากันได้กับ ggml และการเตรียมโมเดลให้ทำตามคำแนะนำของ llama.cpp
  • หากใช้ --session FILE จะสามารถบันทึกและโหลดสถานะของโมเดล เพื่อ คงบริบท สำหรับบทสนทนายาว ๆ หรือข้ามการรันหลายครั้งได้

ตัวอย่างการสนทนาด้วยเสียงในเทอร์มินัล

  • whisper.cpp/examples/talk-llama เป็นตัวอย่างสำหรับ สนทนาด้วยเสียงกับ LLaMA AI ในเทอร์มินัล
  • เดโมประสิทธิภาพ ณ วันที่ 2 พฤศจิกายน 2023 ระบุว่ารันด้วยชุด Whisper Medium + LLaMA v2 13B Q8_0 บน M2 Ultra
  • เดโมก่อนหน้านี้มีวิดีโอแยกต่างหากเป็น ตัวอย่างการรันบน CPU

ขั้นตอนการ build และการรัน

  • whisper-talk-llama พึ่งพาไลบรารี SDL2 สำหรับการจับเสียงจากไมโครโฟน
  • ตัวอย่างการติดตั้ง SDL2 ตามระบบปฏิบัติการมีดังนี้
    • Linux ตระกูล Debian: sudo apt-get install libsdl2-dev
    • Fedora Linux: sudo dnf install SDL2 SDL2-devel
    • Mac OS: brew install sdl2
  • ในการ build ด้วย CMake ให้เปิดใช้ตัวเลือก WHISPER_SDL2=ON
    • cmake -B build -S . -DWHISPER_SDL2=ON
    • cmake --build build --config Release
  • ตัวอย่างการรันจะระบุโมเดล Whisper, โมเดล LLaMA, prompt และจำนวนเธรดร่วมกัน
    • ./build/bin/whisper-talk-llama -mw ./models/ggml-small.en.bin -ml ../llama.cpp/models/llama-13b/ggml-model-q4_0.gguf -p "Georgi" -t 8

ตัวเลือกสำหรับระบุโมเดล

  • อาร์กิวเมนต์ -mw ใช้ระบุโมเดล Whisper ที่จะใช้งาน
    • สำหรับประสบการณ์แบบเรียลไทม์ แนะนำโมเดล base หรือ small
  • อาร์กิวเมนต์ -ml ใช้ระบุโมเดล LLaMA ที่จะใช้งาน
    • วิธีรับโมเดล LLaMA ที่เข้ากันได้กับ ggml ให้ดูคำแนะนำของ llama.cpp

ต่อบริบทด้วยไฟล์เซสชัน

  • whisper-talk-llama รองรับ การจัดการเซสชัน เพื่อให้บทสนทนามีความสอดคล้องและต่อเนื่องมากขึ้น
  • สามารถคงบริบทจากการโต้ตอบก่อนหน้า เพื่อเข้าใจคำขอของผู้ใช้และตอบกลับได้เป็นธรรมชาติมากขึ้น
  • การรองรับเซสชันเปิดใช้งานได้ด้วยตัวเลือกบรรทัดคำสั่ง --session FILE ตอนรัน
    • หลังการโต้ตอบแต่ละครั้ง สถานะโมเดลของ whisper-talk-llama จะถูกบันทึกลงไฟล์ที่ระบุ
    • หากไฟล์ไม่มีอยู่ จะสร้างขึ้นใหม่
    • หากไฟล์มีอยู่ จะโหลดสถานะโมเดลจากไฟล์นั้นและกลับมาทำงานต่อจากเซสชันก่อนหน้า
  • มีประโยชน์เมื่อโต้ตอบกับ AI assistant ในบทสนทนายาว ๆ หรือข้ามหลายเซสชัน เพราะช่วยจดจำการโต้ตอบก่อนหน้าและให้คำตอบที่มีบริบทเกี่ยวข้องมากขึ้น
  • ตัวอย่างการรัน:
    • ./build/bin/whisper-talk-llama --session ./my-session-file -mw ./models/ggml-small.en.bin -ml ../llama.cpp/models/llama-13b/ggml-model-q4_0.gguf -p "Georgi" -t 8

เอาต์พุตเสียงและฟีดแบ็ก

  • หากต้องการฟังคำตอบข้อความที่สร้างขึ้นเป็นเสียง จำเป็นต้องใช้ เครื่องมือ TTS
  • สามารถใช้เอนจิน TTS ที่ต้องการได้ และปรับแก้สคริปต์ speak ให้เหมาะกับความต้องการ
  • ค่าเริ่มต้นใช้ say ของ MacOS หรือ SpeechSynthesizer ของ Windows
  • ระบุว่าสามารถให้ฟีดแบ็กได้ที่ GitHub Discussion #672

1 ความคิดเห็น

 
GN⁺ 2023-11-03
ความคิดเห็นบน Hacker News
  • เห็นตรงนี้แล้วน่าสนุกดีครับ :)
    ตอนนี้ ประสิทธิภาพของ Apple Silicon น่าจะดีขึ้นกว่าที่เห็นในวิดีโอมากแล้ว whisper.cpp ตอนนี้รันบน GPU ได้เต็มรูปแบบ และในช่วงไม่กี่เดือนที่ผ่านมา ความเร็วในการสร้างข้อความของ llama.cpp ก็ดีขึ้นมาก

    • ใช้เวลาแค่ 13 นาทีจนถึงคอมมิตวิดีโอเดโมใหม่ ก็ไม่เลวนะ :D
      ประสิทธิภาพจริงก็น่าประทับใจด้วย
    • ดูเหมือนตอนนี้คุณจะค่อนข้างดังแล้ว มีความเป็นไปได้สูงว่ามีคนจำนวนมากคอยตาม GitHub อย่างใกล้ชิด
    • ผมส่ง PR เพื่อย้ายเดโมใหม่ขึ้นไปไว้ด้านบนแล้ว ผมว่าเดโมใหม่นี้ดีกว่ามาก
    • การรันสิ่งนี้บน Apple Silicon คุ้มค่าที่สุดในแง่ต้นทุนหรือเปล่า หรือทำบนเซิร์ฟเวอร์ Linux homelab ที่แรง ๆ จะถูกกว่า?
    • มันจะทำงานกับ distilled Llama รุ่นล่าสุดด้วยไหม?
  • เยี่ยมเลยครับ ช่วงหลังผมลองเชื่อม Llama เข้ากับ โมเดลสังเคราะห์เสียง แบบโอเพนซอร์สในโปรเจกต์หนึ่ง มีประเด็นทางวิศวกรรมที่น่าสนใจอยู่มาก
    โดยส่วนตัวแล้ว เครื่องมือช่วยเขียนโค้ดที่มีประโยชน์ที่สุดสำหรับผมคือเครื่องมือที่ช่วยลด ภาระงานแบบทำมือ เช่น สร้างอาร์กิวเมนต์และชนิดข้อมูลจาก docstring หรือทำกลับกัน มากกว่าจะพยายามคิดยาก ๆ หรือแก้ปัญหาแทน งานที่ซับซ้อนกว่านั้นดูเหมือนต้องให้จุดเริ่มต้นที่ค่อนข้างดีกับเครื่องมือช่วยก่อน
    ผมมักพูดกับตัวเองระหว่างเขียนโค้ด ถ้าเครื่องมือแบบนี้สามารถฝังคำพูดของผมเป็นเวกเตอร์บริบทเพื่อใช้เป็นอินพุตเพิ่มเติม และให้จุดเริ่มต้นที่ดีกว่ากับโมเดลได้ ก็คงให้ความรู้สึกล้ำอนาคตและมีประโยชน์มาก ผมเป็นคนที่ยอมรับ Copilot ค่อนข้างช้าและไม่ได้ใช้ตลอดเวลา แต่ถ้าใครรู้จักอะไรที่คล้ายกันก็อยากทราบครับ

  • ถ้า ข้อเสนอเรื่อง open weights กลายเป็นจริงภายใน 270 วัน อีกไม่กี่เดือนข้างหน้าก็อาจถูกแบนในทางปฏิบัติได้เลยนะ

    • ข้ออ้างนั้นไม่ได้รับการสนับสนุนจากเนื้อหาคำสั่งฝ่ายบริหารของ Biden มีเพียงข้อกำหนดให้หน่วยงานรัฐบาลหลายแห่งจัดทำกรอบการประเมินความปลอดภัย ทำการประเมินเบื้องต้นต่อโมเดลแบบ open weights และส่งข้อเสนอแนะถึงประธานาธิบดีภายใน 270 วันเท่านั้น
      เท่าที่ผมหาเจอ ไม่มีเนื้อหาใดเลยที่พูดถึงการ แบนโมเดลแบบ open weights และก็ไม่ค่อยเห็นเหตุผลว่าทำไมข้อเสนอแนะสุดท้ายถึงจะมีคำว่า “ให้แบน” อยู่ในนั้น
      ตัวอย่างเช่น พอจะจินตนาการได้ว่ารัฐบาลอาจให้ข้อเสนอแนะที่เอื้อประโยชน์ต่อผู้เล่นเดิม เช่น ทำให้ภาระในการนำโมเดลแบบ open weights มาใช้สูงเกินไปจนการซื้อ OpenAI ดูน่าสนใจกว่ามาก แต่นั่นต่างจากสิ่งที่พูดไว้เดิม
      คำสั่งฝ่ายบริหารดูอ่านค่อนข้างง่ายนะครับ ผมพลาดอะไรในตัวบทไปหรือเปล่า?
      https://www.whitehouse.gov/briefing-room/presidential-action...
    • ผมไม่เห็นว่ามีเนื้อหาว่าน้ำหนักจะถูกแบน ส่วนที่ผมเห็นเหมือนเป็นการให้ทำรายงานเกี่ยวกับ ความเสี่ยงและประโยชน์ของ open weights มากกว่า
      ผมเห็นด้วยว่าวิธีที่เปิดขอบเขตไว้กว้างนั้นน่ากังวล แต่การแบนจริง ๆ อยู่ตรงไหน?
    • เรื่องนี้เป็นภัยคุกคามร้ายแรงแค่ไหน? จะบังคับใช้เรื่องโง่ ๆ แบบนี้ได้อย่างไรโดยไม่ปรึกษาผู้นำในอุตสาหกรรมเลย?
  • บน Arch และ Debian พอรัน ./talk-llama แล้วเกิด floating point exception ผมตรวจ sdl2lib กับ ffmpeg แล้ว และดู issue ที่เกี่ยวข้อง (https://github.com/ggerganov/whisper.cpp/issues/1325) ด้วย แต่ยังแก้ไม่ได้ มีใครเจอเหมือนกันไหม?

    • ผมเจอปัญหาเดียวกันบน PopOS 22.04 แล้วสิ่งนี้ช่วยได้:
      https://github.com/ggerganov/whisper.cpp/issues/352#issuecom...
      ไม่แน่ใจว่าอะไรเปลี่ยนไป แต่โดยพื้นฐานแล้วผมลบ ffmpeg กับ libsdl2-dev ออก แล้วรัน make ที่รากของ repository จากนั้นติดตั้ง libsdl2 กับ ffmpeg แล้วรัน make talk-llama
      บน i7-8550U แบบ 4 คอร์กับ RAM 16GB ค่อนข้างช้า
      ที่รากของ repository ผมทำประมาณนี้:
      $ sudo apt purge ffmpeg
      $ make clean
      $ git pull
      $ make
      $ sudo apt install libsdl2-dev
      $ make talk-llama
      $ ./talk-llama -mw ./models/ggml-small.en.bin -ml ../llama.cpp/models/llama-2-13b.Q4_0.gguf -p "t0mk" -t 8\n\n
  • ไม่มีโซลูชัน text-to-speech ที่รับ สตรีมข้อความ แล้วพูดออกมาทันที โดยไม่ต้องรอให้ Llama สร้างเสร็จหรือครับ?
    คงเป็นไปได้ก็ต่อเมื่อโมเดลเติมบัฟเฟอร์ได้เร็วพอจนเอนจินสังเคราะห์เสียงไม่หยุดกลางคัน

    • ถ้าบัฟเฟอร์เหลือแค่คำเดียว ก็ให้ llama.cpp ปล่อยคำอย่าง “um”, “uhh” ออกมาก็ได้สินะ :D
    • ต้องรู้ว่าประโยคกำลังจะไปทางไหน จังหวะและการเน้นเสียง ถึงจะเข้าที่มากขึ้น ไม่อย่างนั้นอาจฟังเหมือนล่าม UN ที่พูดคำต่อคำแบบราบเรียบต่อเนื่องไป
    • ElevenLabs และ Gemelo.AI เป็นบริการที่รองรับ การสตรีมอินพุตข้อความ เพื่อใช้กับกรณีนี้โดยตรง เท่าที่ผมรู้ยังไม่มีโมเดล incremental TTS แบบโอเพนซอร์ส แต่ก็สามารถทำให้คล้ายกันได้ด้วยวิธีบัฟเฟอร์ token ไว้ แล้วเมื่อเจอเครื่องหมายวรรคตอนค่อยส่งไปยังโมเดลสังเคราะห์เสียง
  • อย่ารอจนการตอบกลับของ LLM ทั้งหมดจบ แต่สตรีมเสียงสังเคราะห์ทันทีที่สร้างออกมาเป็นชุด ๆ ประมาณ 6 โทเค็น จะช่วยลดความหน่วงได้ไหม?

    • ใช่ ตอนนั้นตั้งใจจะทำแบบนั้น แต่มีงานอื่นแทรกเข้ามา ตัวอย่างง่าย ๆ นี้สามารถปรับปรุงได้หลายทาง
      ตอนนี้ใช้แค่ค่า threshold แบบปรับตัวได้พื้นฐานสำหรับ การตรวจจับการจบคำพูด ซึ่งยังทำให้ดีขึ้นได้ และอาจให้ LLM ขนาดเล็กสร้างคำตอบทั่วไปที่รวดเร็วระหว่างที่ LLM ขนาดใหญ่กำลังคำนวณอยู่ก็ได้ การสังเคราะห์เสียงก็สามารถสตรีมเป็น chunk หรือเป็นประโยคได้เช่นกัน
      ผมมองว่าหนึ่งในเวอร์ชันโอเพนซอร์สที่ดีกว่าของแชตบอตแบบนี้คือ https://github.com/yacineMTB/talk ตอนนี้มีโอกาสสูงว่าจะมีโปรเจกต์คล้าย ๆ กันมากขึ้นแล้ว
  • อินเทอร์เฟซแชต ที่ดีที่สุดสำหรับ Llama คืออะไร? ผมมี 3090 อยู่ เลยอยากลองรันโมเดลสักตัวจากเทอร์มินัลสำหรับงานโค้ดดิ้งเร็ว ๆ

    • ollama ใช้ง่ายมากจริง ๆ เป็นไบนารีเดี่ยวที่ดาวน์โหลดโมเดลเมื่อจำเป็น คล้ายกับวิธีที่ Docker ดึง image
      pacman -S ollama
      ollama serve
      ollama run llama2:13b 'insert prompt'
      https://ollama.ai/
    • มีโปรเจกต์โอเพนซอร์สที่รองรับเสียงด้วย:
      https://github.com/cogentapps/chat-with-gpt
      ดูเหมือนจะทำมาให้ใช้ ElevenLabs และ OpenAI API แต่ก็น่าจะตั้งค่าให้เข้ากับ Whisper.cpp และ Llama แบบโลคัลได้ไม่ยาก
    • แม้ไม่ใช่โอเพนซอร์ส แต่มี lmstudio.ai ที่ตอนนี้ยังใช้ฟรีได้ มีทั้งประวัติแชต, UI สำหรับตั้งค่าที่ใช้ได้ดี, การจัดการพรอมป์ที่ง่าย, การจัดการและสำรวจโมเดล, การตั้งค่าที่เรียบง่าย, รองรับหลายแพลตฟอร์ม และยังมีฟังก์ชัน API server สำหรับเชื่อมกับเครื่องมืออื่น ๆ
      เขากำลังรับสมัครงานและยังไม่มีกลยุทธ์ทำรายได้ที่เปิดเผย จึงคาดว่าอีกไม่นานคงมีการเปลี่ยนแปลง เช่น นำฟีเจอร์ฟรีบางส่วนไปคิดเงินหรือจำกัดการใช้งานโดยตั้งใจ ถึงอย่างนั้น แอปบาง ๆ สำหรับ LLM ฟรีที่พึ่งพา llama.cpp อย่างเต็มที่ก็สร้าง vendor lock-in ได้ยากอยู่ดี ถ้าให้ความสำคัญกับโอเพนซอร์สมากกว่าฟีเจอร์ ผมก็แนะนำ ollama เช่นกัน
    • ตัวที่ตั้งค่าง่ายที่สุดคืออันนี้: https://faraday.dev/
      สำหรับคำถามเชิงเทคนิค ตอนนี้ผมว่า Wizard กำลังเป็นตัวเด่น
    • ขึ้นอยู่กับว่า “ดีที่สุด” หมายถึงอะไร ถ้าหมายถึง inference ระดับล้ำหน้าที่เร็วที่สุดเท่าที่เป็นไปได้ บน 4090 ก็คือ ExLlama หรือ ExLlamaV2
  • ผมพอใจกับ ollama มากสำหรับการรัน LLM โอเพนซอร์สแบบโลคัล แล้วฝั่ง Whisper หรือ โมเดลสังเคราะห์เสียง โอเพนซอร์สรุ่นใหม่ ๆ มีอะไรที่เทียบเท่ากันไหม? ผมไม่ค่อยรู้จักโปรเจกต์ที่ช่วยตั้งค่า Whisper ให้รันโลคัลได้ง่ายขนาดนั้น

    • มี frontend สำหรับ SRT อยู่หลายตัวที่นี่: https://www.reddit.com/r/OpenAI/comments/163hzhe/recommended...
      ตัวที่ชื่อ WhisperScript ก็ดูค่อนข้างดี: https://github.com/openai/whisper/discussions/1028
      อย่างไรก็ตาม การตั้งค่า WhisperX ก็ไม่ได้ยากขนาดนั้น นี่เป็นบันทึกขั้นตอนที่ผมสรุปไว้เมื่อไม่กี่เดือนก่อน: https://llm-tracker.info/books/logbook/page/transcription-te...
    • ผมใช้ MacWhisper เป็นแอปบน macOS มาหลายเดือนเพื่อทำงานถอดเสียงด้วย Whisper และค่อนข้างชอบ
      https://goodsnooze.gumroad.com/l/macwhisper
    • Whisper เป็น โมเดลรู้จำเสียงพูด ถ้าต้องการถอดเสียงจากไฟล์เสียงแบบโลคัลผ่าน CLI ใช้ whisperx ได้ และยังมี whisper-turbo.com ที่รันในเบราว์เซอร์ด้วย
      ส่วนการสังเคราะห์เสียง coqui มีประสบการณ์ผู้ใช้และโมเดลที่ดีที่สุดในหลายภาษา แต่คุณภาพยังไม่ถึงระดับเดียวกับผู้ให้บริการสังเคราะห์เสียงเชิงพาณิชย์
  • ช่วยอธิบายแบบง่าย ๆ ได้ไหมว่าสิ่งนี้ทำอะไรได้บ้าง? มันสามารถเรียนรู้และคงบริบทของแชตไว้ พร้อมสร้างอะไรคล้าย ๆ ความจำระยะยาว ได้ไหม?

    • ผมไม่ใช่ผู้เชี่ยวชาญ LLM แต่ตามที่ผมเข้าใจ โครงสร้างคือรัน การรู้จำเสียงพูด → Llama → การสังเคราะห์เสียง บนพีซีของตัวเอง ไม่ใช่เซิร์ฟเวอร์ของบุคคลที่สาม
      ขีดจำกัดบริบทของ LLM ขึ้นอยู่กับโมเดลและการตั้งค่าที่ผู้ใช้เลือก เช่น ใช้โมเดลอะไรอย่าง Llama 2, Wizard Vicuna และตั้งค่า context window อย่างไร LLM ไม่ได้ “ตอบ” ผู้ใช้โดยตรงเท่าไรนัก แต่คาดเดาเนื้อหาถัดไปที่น่าจะเป็นไปได้ที่สุดจากประวัติการสนทนาระหว่างผู้ใช้กับ assistant ที่มีประโยชน์ แล้วผลลัพธ์ก็คือมันแสร้งเป็น assistant ที่มีประโยชน์ได้สำเร็จจนกลายเป็น assistant ที่มีประโยชน์จริง ๆ เรื่องนี้เลยอาจชวนสับสนได้
      ถ้าเปลี่ยน pipeline ก็น่าจะทำพฤติกรรมแบบนั้นได้ โครงสร้างจะเป็น การรู้จำเสียงพูด → Wrapper[Llama] → การสังเคราะห์เสียง และถ้า Wrapper สามารถปล่อยให้ Llama ทำสิ่งที่ควรทำ พร้อมเพิ่มการประมวลผลเพิ่มเติมกับข้อความอินพุตได้ ก็จะน่าสนใจขึ้น
      Wrapper อาจวิเคราะห์บทสนทนาแล้วดึงองค์ประกอบสำคัญออกมา เช่น “คนนี้ชื่อ Bob เป็นผู้ชาย อายุ 35 ปี ชอบสุนัข ชอบความเป็นระเบียบ ต้องการให้เตือนโทรหาลูกสาวตอน 5 โมงเย็น เป็นสายลับแฝงตัวของมาเฟียแอนตาร์กติกา และชอบให้พูดด้วยสำเนียงโปแลนด์จัด ๆ” แล้วทำงานตามนั้นได้
      เช่น สร้างการเตือนตอน 5 โมงเย็นผ่าน HomeAssistant ตั้งค่าเอนจินสังเคราะห์เสียงให้เป็นสำเนียงโปแลนด์ และแก้ไขประวัติการสนทนาเริ่มต้นสำหรับการรันครั้งต่อ ๆ ไป อาจใส่ชื่อคนไว้ในการสนทนาภายใน และย่อความสนใจหรือบุคลิกไปใส่ในบทแนะนำล่วงหน้าของการสนทนาครั้งถัดไป
      แบบนี้จะทำให้เกิดการโต้ตอบผ่านการกระทำที่เครื่องมืออื่นทำให้ และสร้างความต่อเนื่องได้ด้วยการแก้ไขประวัติการสนทนาครั้งถัดไป
  • อันนี้ให้ กลิ่นอาย ELIZA แรงมากจริง ๆ