speech · 목소리·음성 인식·대화

목소리 만들기(TTS)·음성 인식(STT)·대화(LLM)를 기기 안에서 합니다.

Class: Speech SpeechOnDevice SpeechToText Dialog

class openpibo.speech.Speech[소스]

기반 클래스: object

Functions: tts() stt()

  • TTS (Text to Speech)

  • STT (Speech to Text) — 기기 안에서 처리합니다 (SpeechToText)

example:

from openpibo.speech import Speech

speech = Speech()
# 아래의 모든 예제 이전에 위 코드를 먼저 사용합니다.
tts(text, filename='tts.wav', voice='espeak', lang='ko')[소스]

TTS(Text to Speech)

Text(문자)를 Speech(말)로 변환하여 파일로 저장합니다.

espeak 로 기기 안에서 처리합니다. 서버를 쓰던 목소리(main/boy/girl/man1/ woman1)는 제거됐습니다. 자연스러운 음성이 필요하면 SpeechOnDevice 를 쓰세요 — 온디바이스 ONNX 모델이고 lang='na' 로 언어를 자동 판별합니다.

example:

speech.tts('안녕하세요! 만나서 반가워요!', '/home/pi/tts.wav')
매개변수:
  • text (str) – 변환할 문장

  • filename (str) – 변환된 음성파일의 경로 (wav)

  • voice (str) – espeak 만 지원합니다

  • lang (str) – 사용하지 않습니다 (espeak 기본 음성)

stt(filename='stream.wav', timeout=5, verbose=True)[소스]

STT(Speech to Text)

파이보 마이크로 듣고, 말이 끝나면 글자로 바꿉니다. 기기 안에서 처리합니다 (SpeechToText, 한국어·영어 자동 판별).

timeout 은 최대로 기다리는 시간입니다. 말이 끝나면(약 0.8초 조용하면) 그 전에 멈춥니다. 처음 부를 때 모델을 올리느라 몇 초 더 걸립니다.

example:

text = speech.stt(timeout=5)
매개변수:
  • filename (str) – 들은 소리를 저장할 경로 (wav). None 이면 저장하지 않습니다

  • timeout (int) – 최대 녹음 시간(초)

  • verbose (bool) – 사용하지 않습니다 (예전 코드와 모양을 맞추려고 남겨 둔 인자입니다)

반환:

인식된 문자열. 아무 말도 없으면 빈 문자열

class openpibo.speech.SpeechOnDevice(onnx_dir: str = '/home/pi/.model/tts/assets/onnx', voice_dir: str = '/home/pi/.model/tts/assets/voice_styles', total_step: int = 5, speed: float = 1.05)[소스]

기반 클래스: object

Functions: tts()

  • TTS (Text to Speech)

example:

from openpibo.speech import SpeechOnDevice

speech_od = SpeechOnDevice()
# 아래의 모든 예제 이전에 위 코드를 먼저 사용합니다.
tts(text: str, filename: str = 'tts.wav', voice: str = 'm1', lang: str = 'na') → str[소스]

TTS(Text to Speech) — 텍스트를 음성 파일로 변환합니다.

example:

tts.tts(text='안녕하세요! 만나서 반가워요!', filename='/home/pi/tts.wav', voice='m1', lang='na')
매개변수:
  • text (str) – 변환할 문장

  • filename (str) – 저장할 음성 파일 경로 (.wav)

  • voice (str) – 목소리 종류 (m1~m5/f1~f5)

  • lang (str) – 언어 코드 (‘na’=자동/기타, ‘ko’, ‘en’, ‘ja’ …)

Returns str:

저장된 파일 경로

class openpibo.speech.SpeechToText(model_dir='/home/pi/.model/stt', num_threads=4)[소스]

기반 클래스: object

Functions: listen() transcribe() transcribe_file()

  • STT (Speech to Text) — 기기 안에서 처리합니다. 인터넷이 필요 없습니다

모델은 SenseVoiceSmall int8(한국어·영어·중국어·일본어·광둥어, 언어 자동 판별)이고, 말이 시작하고 끝나는 곳은 silero VAD 로 찾습니다. 둘 다 sherpa-onnx 로 돌립니다. 모델 파일은 /home/pi/.model/stt (model.int8.onnx tokens.txt silero_vad.onnx).

파이보(Pi 4, 2GB)에서 5초 말을 약 1.3초에 받아 적고, 모델을 올리면 약 240MB 를 씁니다.

example:

from openpibo.speech import SpeechToText

stt = SpeechToText()
# 아래의 모든 예제 이전에 위 코드를 먼저 사용합니다.
SAMPLE_RATE = 16000
transcribe(audio, sample_rate=16000)[소스]

소리(숫자 배열)를 글자로 바꿉니다.

25초보다 길면 말 단위로 잘라 받아 적고 이어 붙입니다(통째로 넣으면 글자가 뒤섞입니다).

example:

text = stt.transcribe(audio, 16000)
매개변수:
  • audio (numpy.ndarray) – -1~1 사이 float 소리. 두 채널이면 평균을 냅니다

  • sample_rate (int) – 샘플레이트 (16000 이 아니어도 됩니다)

반환:

인식된 문자열

transcribe_file(filename)[소스]

소리 파일을 글자로 바꿉니다.

example:

text = stt.transcribe_file('/home/pi/myaudio/hello.wav')
매개변수:

filename (str) – 소리 파일 경로 (wav 등 soundfile 이 읽는 형식)

반환:

인식된 문자열

listen(timeout=5, filename=None, end_silence=0.8)[소스]

파이보 마이크로 듣고, 말이 끝나면 글자로 바꿉니다.

말이 끝나고 end_silence 초 동안 조용하면 멈춥니다. timeout 초가 지나면 말하는 중이어도 멈춥니다.

example:

text = stt.listen(timeout=5)
매개변수:
  • timeout (int) – 최대 녹음 시간(초)

  • filename (str) – 들은 소리를 저장할 경로 (wav, 16kHz 한 채널). None 이면 저장하지 않습니다

  • end_silence (float) – 말이 끝났다고 볼 조용한 시간(초)

반환:

인식된 문자열. 아무 말도 없으면 빈 문자열

class openpibo.speech.Dialog[소스]

기반 클래스: object

Functions: start_llm() call_llm() stop_llm()

파이보에서 대화 기능을 하는 클래스입니다. 기기 안에서 도는 LLM(llama-server)에 질문을 보내고 답을 받습니다.

n-gram 챗봇(load reset ngram diff_ngram get_dialog)은 260914v6 에서 제거했습니다. 데이터(dialog.csv)가 한글 전용이라 영문 배포판에서 쓸 수 없었고, 국내에서도 LLM 으로 대체됩니다.

example:

from openpibo.speech import Dialog

dialog = Dialog()
# 아래의 모든 예제 이전에 위 코드를 먼저 사용합니다.
start_llm(port=50020)[소스]

LLM 서비스를 시작합니다. (Chat 모드)

example:

dialog.start_llm()
call_llm(prompt=None, system_prompt=None, temperature=0.8, max_tokens=100)[소스]

LLM 서버(OpenAI 호환 Chat Completions API)를 호출합니다.

예시:

dialog.call_llm(prompt=”안녕하세요”, system_prompt=”너는 내 스마트한 비서야”)

매개변수:
  • prompt (str) – 사용자의 입력 메시지.

  • system_prompt (str) – 시스템 프롬프트. (없으면 기본값 유지)

반환:

생성된 텍스트 또는 API 응답 전체 JSON.

stop_llm()[소스]

LLM 서비스를 중지합니다.

example:

dialog.stop_llm()