Автоматты аударма пайдаланылды

Faster Whisper және Ollama көмегімен Python-да жергілікті офлайн дауыстық көмекшіні қалай құруға болады

Бұл мақалада біз Python-да қарапайым, бірақ толығымен офлайн дауыстық көмекшіні қалай жазу керектігін қарастырамыз. Ол біледі:

  1. Микрофон арқылы пайдаланушының сөзін тыңдаңыз.
  2. Интернетке қосылуды қажет етпейтін Жергілікті Whisper моделі-Faster Whisper көмегімен дауысты тану (мәтінге сөйлеу).
  3. Бұлтта серверсіз жұмыс істейтін ollama — жергілікті іске қосылған LLM (large language model) көмегімен сұрақты талдаңыз және жауапты қалыптастырыңыз.
  4. Pyttsx3 кітапханасы арқылы жауап мәтінін (Text-To-speech) дауыстаңыз.

Мұндай ассистенттің басты артықшылығы-ол интернетсіз жұмыс істейді және сіздің жеке деректеріңіз (дауыстық дыбыс, транскрипцияланған мәтін, диалог тарихы) сыртқы қызметтерге берілмейді.

Алдымен келесі пакеттердің орнатылғанына көз жеткізіңіз:

  • PyAudio-микрофоннан аудио жазу үшін.
  • wave-жазылған дыбысты WAV файлына сақтау үшін (Python стандартты кітапханасы).
  • Faster Whisper-Whisper моделі арқылы сөйлеуді тануға арналған жергілікті кітапхана.
  • Ollama-Интернетке қосылуды қажет етпейтін жергілікті орнатылған LLM.
  • pyttsx3-сөйлеу синтезі кітапханасы (TTS), ол да офлайн режимінде жұмыс істейді.
pip install pyaudio faster-whisper ollama pyttsx3

Ассистент жұмысының негізгі кезеңдері:

  1. Инициализация: кітапханаларды импорттау, PyAudio іске қосу және жазу параметрлерін орнату, жергілікті Whisper моделін жүктеу (Faster Whisper),дауыстық қозғалтқышты инициализациялау (pyttsx3),Ollama қол жетімділігін тексеру (оның жергілікті жерде жұмыс істейтініне және желіге кіруді қажет етпейтініне көз жеткізіңіз).
  2. Кітапханаларды импорттау,
  3. PyAudio іске қосыңыз және жазу параметрлерін реттеңіз,
  4. Жергілікті Whisper моделін жүктеу (Faster Whisper),
  5. Дауыстық қозғалтқыш инициализациясы (pyttsx3),
  6. Ollama қол жетімділігін тексеру (оның жергілікті жерде жұмыс істейтініне және желіге кіруді қажет етпейтініне көз жеткізіңіз).
  7. Дауыстық пәрменді жазу: Код PyAudio жазу ағынын ашады және микрофонды "тыңдайды".Пайдаланушы сөйлеуді тоқтатқан кезде дыбыс деңгейі (RMS) бойынша анықтайды.Бірнеше секунд үнсіздіктен кейін ол жазбаны автоматты түрде тоқтатады және оны WAV файлына сақтайды.
  8. Код pyaudio жазу ағынын ашады және микрофонды "тыңдайды".
  9. Пайдаланушы сөйлеуді тоқтатқан кезде дыбыс деңгейі (RMS) бойынша анықтайды.
  10. Бірнеше секунд үнсіздіктен кейін ол жазбаны автоматты түрде тоқтатады және оны WAV файлына сақтайды.
  11. Сөйлеуді тану (мәтінге сөйлеу):WAV файлы Faster Whisper-ге (жергілікті модель) жіберіледі.Модель шифрланған мәтінді бұлтқа ешқандай деректер жібермей қайтарады.
  12. WAV файлы Faster Whisper-ге (жергілікті модель) жіберіледі.
  13. Модель шифрланған мәтінді бұлтқа ешқандай деректер жібермей қайтарады.
  14. Жауап генерациясы: диалог тарихына транскрипцияланған мәтін (пайдаланушы сұрағы) қосылады.Бүкіл оқиға интернетсіз жергілікті жұмыс істейтін Олламаға жіберіледі.Оллама жүктелген үлкен тіл моделін қолдана отырып жауап қалыптастырады.
  15. Диалог тарихына транскрипцияланған мәтін (пайдаланушы сұрағы) қосылады.
  16. Бүкіл оқиға интернетсіз жергілікті жұмыс істейтін Олламаға жіберіледі.
  17. Оллама жүктелген үлкен тіл моделін қолдана отырып жауап қалыптастырады.
  18. Жауап дауысы (мәтіннен сөйлеуге дейін):көмекші pyttsx3 арқылы жауап береді.Барлығы офлайн режимінде болады және онлайн қызметтерге тәуелді емес.
  19. Көмекші pyttsx3 арқылы жауап береді.
  20. Барлығы офлайн режимінде болады және онлайн қызметтерге тәуелді емес.

Төменде сипатталған функцияларды жүзеге асыратын кодтың мысалы келтірілген.

import pyaudio
import wave
import time
import sys
import struct
import math
from faster_whisper import WhisperModel
import ollama
import pyttsx3
import threading

engine = pyttsx3.init()

model_size = "large-v3"
model = WhisperModel(model_size, device="cpu", compute_type="int8")

CHUNK = 1024 # бір кадрдағы үлгілер саны
RATE = 16000 # іріктеу жылдамдығы
FORMAT = pyaudio.paInt16
CHANNELS = 1

# Дыбыс деңгейі шегі, оның астында пайдаланушы "үнсіз"деп есептейміз
THRESHOLD = 300

# Жазуды тоқтату үшін қанша секунд қатарынан "үндемеу" керек
SILENCE_LIMIT = 2.0

# Мұнда біз диалогтың бүкіл тарихын сақтаймыз
messages = []

def rms(data):
    """
    Бір байт блогы үшін шамамен көлемді (RMS) есептеңіз.
    деректер: PyAudio-дан оқылған байт жолы
    """
    count = len (data) / / 2 # int16 форматындағы санақ Саны
    format_str = "<" + "h" * count
    shorts = struct.unpack_from(format_str, data)

    sum_squares = 0.0
    for sample in shorts:
        sum_squares += sample * sample

    if count == 0:
        return 0

    return math.sqrt(sum_squares / count)

def record_once(filename="audio.wav"):
    """
    Біз сөйлеудің бір бөлігін жазамыз ("үнсіздікке" дейін) және WAV файлына сақтаймыз.
    Жазылған файлға жолды қайтарыңыз.
    """
    p = pyaudio.PyAudio()
    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)

    frames = []
    басып шығару ("жазуды бастау (сөйлеңіз)...")

    silence_counter = 0 # "тыныш" chunk ' s есептегіші
    while True:
        data = stream.read(CHUNK)
        frames.append(data)
        # Ағымдағы CHUNK көлемін есептейік
        current_rms = rms(data)
        if current_rms < THRESHOLD:
            # Шекті деңгейден төмен дыбыс => "үнсіздік"
            silence_counter += 1
        else:
            silence_counter = 0
        # Егер үнсіз блоктардың жалпы ұзындығы silence_limit секундынан асып кетсе, шығыңыз
        if silence_counter * (CHUNK / RATE) > SILENCE_LIMIT:
            break
    басып шығару ("жазу аяқталды.")

    stream.stop_stream()
    stream.close()
    p.terminate()

    # WAV файлына сақтаңыз
    wf = wave.open(filename, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames))
    wf.close()
    return filename

def transcribe(filename):
    """
    Файлды faster_whisper көмегімен танимыз.
    Біз танылған мәтінді қайтарамыз.
    """
    segments, info = model.transcribe(filename, beam_size=8)
    print("Detected language '%s' with probability %f" % (info.language, info.language_probability))
    texts = ''
    for segment in segments:
        texts += segment.text
    return texts

def main():
    while True:
        # 1. Сөйлеу үзіндісін жазу
        audio_path = record_once("audio.wav")
        # 2. Біз танимыз
        user_text = transcribe(audio_path)
        # Егер кенеттен тану бос жолды қайтарса-өткізіп жіберіңіз
        if not user_text.strip():
            print ("пайдаланушы ештеңе айтқан жоқ немесе танылған жоқ, біз тыңдай береміз...")
            continue

        басып шығару ("пайдаланушы айтты:", user_text)

        # 3. Пайдаланушының жаңа хабарламасы ретінде тарихқа қосыңыз
        messages.append({"role": "user", "content": user_text})

        # 4. Біз бүкіл оқиғаны Олламаға жібереміз
        #    ollama.chat хабарламалар тізімін жіберуге мүмкіндік береді
        response = ollama.chat(
            'qwen2.5-coder:latest',
            messages=messages,
        )
        # 5. Жауап мәтінін шығарыңыз
        assistant_text = response['message']['content']
        print ("Assistant жауап берді:", assistant_text)

        # 6. Ассистенттің жауабын тарихқа сақтаңыз
        messages.append({"role": "assistant", "content": assistant_text})

        # 7. Жауап беру
        engine.say(assistant_text)
        engine.runAndWait()
        # Әрі қарай цикл қайталанады, біз қайтадан жазамыз және т. б.

if __name__ == "__main__":
    main()
  1. Faster Whisper-Whisper-дің жергілікті нұсқасы. Сөйлеуді тануға арналған барлық дыбыстық өңдеу сіздің компьютеріңізде.
  2. Ollama-егер сіз қалаған тіл үлгісін алдын ала жүктеп алсаңыз, бұл құрал толығымен интернет қосылымынсыз жұмыс істей алады. Жауаптың генерациясы жергілікті жерде жүреді.
  3. pyttsx3-сыртқы API қолданбайтын мәтін-сөйлеу кітапханасы. Барлығы компьютерде синтезделеді.
  4. PyAudio - микрофоннан дыбысты жергілікті түрде оқиды және оны желіге жібермейді.

Осылайша, ассистент жұмысының ешқандай кезеңі сіздің деректеріңізді Интернетке жібермейді. Сіз Whisper (немесе басқа LLM) модельдері мен нұсқаларын өзіңіз басқарасыз.

  • Модельді таңдау: жылдамдық пен тану дәлдігі арасындағы тепе-теңдікті табу үшін әртүрлі faster Whisper (small, medium, large) үлгілерін қолданып көріңіз.
  • Шуды болдырмау: егер сізде шулы орта болса, шуды болдырмау және тану сапасын жақсарту үшін кітапхана қосуға болады.
  • Балама тілдік модельдер: Ollama тек qwen2.5-coder-ді ғана емес, сонымен қатар басқа модельдерді де қолдайды. Тапсырмаларыңызға сәйкес келетінін таңдаңыз (мысалы, кодты құру, ортақ чат, аударымдар және т.б.).
  • GUI: көмекшіні басқару және танылған мәтін мен жауаптарды көру үшін қарапайым GUI қосыңыз (мысалы, PyQt немесе tkinter-де).

Біз микрофонды жазудан және сөйлеуді танудан бастап, жауапты құруға және дауыстауға дейін интернетсіз жұмыс істейтін офлайн дауыстық көмекшіні құрдық. Бұл жеке деректердің қауіпсіздігін қамтамасыз етудің және жүйені өзіңіз үшін икемді түрде орнатудың тамаша тәсілі. Енді сіз ассистенттің функционалдығын кеңейте аласыз, оны әртүрлі командаларды орындауға және күрделі диалогтарды өңдеуге үйрете аласыз — барлығы жергілікті және деректерді толық басқара отырып.

Тәжірибе жасаңыз, жаңа мүмкіндіктер қосыңыз және жергілікті көмекшіңіз жұмыс пен күнделікті өмірде таптырмас құрал болсын!

Пікірлер 1

Кіру пікір қалдыру үшін