모두와 대화하기은(는) 무엇을 하나요?
온라인 동영상에서 실제 인물의 목소리를 복제하거나, 사진에서 음성을 디자인하여 해당 인물로 역할극을 하며 TTS로 말합니다.
중요: 윤리적 사용 및 저작권
이 스킬은 실제 목소리를 모방하는 음성을 합성합니다. 진행하기 전에 에이전트는 반드시:
- 절대 속이거나, 사기치거나, 괴롭히기 위해 다른 사람을 사칭하지 않습니다.
- 참조 오디오로 공개적으로 이용 가능한 미디어(공개 연설, 인터뷰, 기자 회견)만 사용합니다.
- 생성된 오디오는 합성된 것이며 실제 녹음으로 제시되어서는 안 된다는 점을 사용자에게 알립니다.
- 동의하지 않은 개인을 대상으로 하거나, 사기, 괴롭힘, 명예 훼손을 명백히 의도한 요청은 거절합니다.
사용자의 의도가 유해해 보이면 정중히 거절하고 그 이유를 설명합니다.
사전 요구 사항
| 의존성 | 유형 | 확인 방법 |
|---|---|---|
ffmpeg | 시스템 바이너리 | ffmpeg -version |
yt-dlp | 시스템 바이너리 | yt-dlp --version |
tts 스킬 | Cursor 스킬 | ls skills/tts/scripts/tts.py |
NOIZ_API_KEY | 환경 변수 또는 파일 | python3 skills/tts/scripts/tts.py config --show |
첫 실행 전, 모든 의존성이 있는지 확인하세요:
ffmpeg -version && yt-dlp --version && ls skills/tts/scripts/tts.py
yt-dlp가 없으면 설치하세요:
uv pip install yt-dlp
Noiz API 키가 설정되지 않은 경우:
python3 skills/tts/scripts/tts.py config --set-api-key YOUR_KEY
모드 선택
- 사용자가 인물 이름 지정(실제 또는 가상) --> 워크플로 A
- 사용자가 이미지 제공, 인물을 알아볼 수 없음 --> 워크플로 B
- 사용자가 이미지 제공, 인물이 인식 가능한 공인 --> 워크플로 A (실제 음성이 더 진짜 같음)
- 이미지에 여러 사람 --> 먼저 어떤 사람인지 물어보세요
워크플로 A: 이름 기반 (온라인 동영상에서 음성)
다음 체크리스트로 진행 상황을 추적하세요:
- [ ] A1. 캐릭터 구분
- [ ] A2. 참조 동영상 찾기
- [ ] A3. 오디오 + 자막 다운로드
- [ ] A4. 최적의 참조 구간 추출
- [ ] A5. 음성 생성
A1. 캐릭터 구분
모호한 경우(예: "미국 대통령", "스파이더맨 배우"), 진행하기 전에 사용자에게 정확한 인물을 지정하도록 요청하세요.
A2. 참조 동영상 찾기
웹 검색을 사용하여 해당 인물이 명확하게 말하는 YouTube(또는 Bilibili) 동영상을 찾으세요. 가장 좋은 후보: 인터뷰, 연설, 기자 회견. 배경 음악이 심한 동영상은 피하세요.
검색어 시도:
{CHARACTER_NAME} interview/{CHARACTER_NAME} 采访{CHARACTER_NAME} speech/{CHARACTER_NAME} 演讲{CHARACTER_NAME} press conference
A3. 오디오 및 자막 다운로드
mkdir -p "tmp/chat_with_anyone/{CHARACTER_NAME}"
yt-dlp -x --audio-format mp3 \
--write-subs --write-auto-subs --sub-langs "en,zh-Hans" \
--convert-subs srt \
-o "tmp/chat_with_anyone/{CHARACTER_NAME}/%(title)s.%(ext)s" \
"{VIDEO_URL}"
다운로드 후, 출력 디렉터리를 나열하여 오디오 파일과 SRT 자막 파일을 확인하세요:
ls tmp/chat_with_anyone/{CHARACTER_NAME}/
예상 출력: .mp3 오디오 파일과 하나 이상의 .srt 자막 파일.
자막 파일이 없는 경우: 자동 생성 자막이 있는 다른 동영상을 시도하거나, 대상 언어에 맞게 --sub-langs를 조정하세요.
A4. 최적의 참조 구간 추출
자동 추출 스크립트를 사용하세요. SRT를 구문 분석하고 가장 밀도 높은 3~12초 음성 창을 찾아 WAV로 추출합니다:
python3 skills/chat-with-anyone/scripts/extract_ref_segment.py \
--srt "tmp/chat_with_anyone/{CHARACTER_NAME}/{SRT_FILE}" \
--audio "tmp/chat_with_anyone/{CHARACTER_NAME}/{AUDIO_FILE}" \
-o "tmp/chat_with_anyone/{CHARACTER_NAME}/ref.wav"
스크립트는 선택된 시간 범위를 출력하고 참조 WAV를 저장합니다. 계속하기 전에 출력이 존재하고 비어 있지 않은지 확인하세요.
스크립트가 적합한 구간을 찾지 못한 경우: 더 짧은 클립을 위해 --min-duration 2를 시도하거나 다른 동영상을 다운로드하세요.
A5. 음성 생성 및 역할극
캐릭터에 맞게 응답을 작성한 후 합성합니다:
python3 skills/tts/scripts/tts.py \
-t "{RESPONSE_TEXT}" \
--ref-audio "tmp/chat_with_anyone/{CHARACTER_NAME}/ref.wav" \
-o "tmp/chat_with_anyone/{CHARACTER_NAME}/reply.wav"
생성된 오디오 파일을 텍스트와 함께 사용자에게 제공합니다. 후속 메시지에서는 동일한 --ref-audio 경로를 재사용하세요.
워크플로 B: 이미지 기반 (사진에서 음성)
다음 체크리스트로 진행 상황을 추적하세요:
- [ ] B1. 이미지 분석
- [ ] B2. 음성 디자인
- [ ] B3. 미리 듣기 (선택 사항)
- [ ] B4. 음성 생성
B1. 이미지 분석
비전 기능을 사용하여 이미지를 검사합니다:
- 인물이 인식 가능한 공인인 경우 --> 실제 음성을 위해 워크플로 A로 전환합니다.
- 알아볼 수 없는 경우, 다음을 포함하는 음성 설명을 생성합니다:
- 성별 (남성 / 여성)
- 대략적인 나이 (예: "약 30세")
- 겉보기 태도 (예: 명랑함, 권위적, 부드러움)
- 맥락적 단서 (예: 정장 --> 전문적인 어조; 운동복 --> 활기찬)
B2. 음성 디자인
이미지와 설명을 음성 디자인 스크립트에 전달합니다:
python3 skills/chat-with-anyone/scripts/voice_design.py \
--picture "{IMAGE_PATH}" \
--voice-description "{VOICE_DESCRIPTION}" \
-o "tmp/chat_with_anyone/voice_design"
스크립트 출력:
- 감지된 음성 특징 (stdout에 출력)
- 출력 디렉터리의 미리 듣기 오디오 파일
- 최적의 음성 ID가 포함된
voice_id.txt
음성 ID 읽기:
cat tmp/chat_with_anyone/voice_design/voice_id.txt
B3. 미리 듣기 (선택 사항)
출력 디렉터리의 미리 듣기 오디오 파일을 제공하여 사용자가 음성을 들을 수 있게 합니다. 만족스럽지 않으면 조정된 --voice-description 또는 --guidance-scale로 B2를 다시 실행하세요.
B4. 음성 생성 및 역할극
python3 skills/tts/scripts/tts.py \
-t "{RESPONSE_TEXT}" \
--voice-id "{VOICE_ID}" \
-o "tmp/chat_with_anyone/voice_design/reply.wav"
후속 메시지에서는 일관성을 위해 동일한 --voice-id를 계속 사용하세요.
예시: 이름 기반
사용자: 我想跟特朗普聊天,让他给我讲个睡前故事。
에이전트 단계:
- 캐릭터: Donald Trump. 구분 불필요.
Donald Trump speech youtube검색, 명확한 연설 동영상 찾기.- 다운로드:
yt-dlp -x --audio-format mp3 --write-subs --write-auto-subs --sub-langs "en" --convert-subs srt -o "tmp/chat_with_anyone/trump/%(title)s.%(ext)s" "https://youtube.com/watch?v=..." - 참조 추출:
python3 skills/chat-with-anyone/scripts/extract_ref_segment.py --srt "tmp/chat_with_anyone/trump/....srt" --audio "tmp/chat_with_anyone/trump/....mp3" -o "tmp/chat_with_anyone/trump/ref.wav" - 트럼프 스타일로 TTS 생성:
python3 skills/tts/scripts/tts.py -t "Let me tell you a tremendous bedtime story..." --ref-audio "tmp/chat_with_anyone/trump/ref.wav" -o "tmp/chat_with_anyone/trump/reply.wav" reply.wav와 이야기 텍스트를 사용자에게 제공합니다.
예시: 이미지 기반
사용자: [photo.jpg 업로드] 我想跟这张图片里的人聊天
에이전트 단계:
- 비전 분석: 알아볼 수 없는 젊은 여성, 약 25세, 캐주얼 스웨터, 따뜻한 미소.
- 음성 디자인:
python3 skills/chat-with-anyone/scripts/voice_design.py --picture "photo.jpg" --voice-description "약 25세의 젊은 중국 여성, 부드럽고 따뜻한 목소리, 친근한 어조" -o "tmp/chat_with_anyone/voice_design" tmp/chat_with_anyone/voice_design/voice_id.txt에서 음성 ID 읽기.- TTS 생성:
python3 skills/tts/scripts/tts.py -t "你好呀!很高兴认识你!" --voice-id "{VOICE_ID}" -o "tmp/chat_with_anyone/voice_design/reply.wav" - 오디오 제공 및 동일한
--voice-id로 역할극 계속.
문제 해결
| 문제 | 해결책 |
|---|---|
yt-dlp 다운로드 실패 또는 동영상 사용 불가 | 다른 동영상 URL 시도; 일부 지역/동영상은 제한됨. yt-dlp -U 실행하여 업데이트 |
| SRT 자막 파일 없음 | --sub-lang en,zh-Hans로 다시 다운로드; 그래도 없으면 자동 자막이 있는 다른 동영상 시도 |
extract_ref_segment.py가 적합한 창을 찾지 못함 | 더 짧은 클립을 위해 --min-duration 2 사용, 또는 다른 동영상 시도 |
| 음성 디자인 오류 반환 | Noiz API 키 확인; 이미지가 사람의 선명한 사진인지 확인 |
| TTS 출력이 이상함 | 워크플로 A의 경우 다른 참조 동영상 시도; 워크플로 B의 경우 --voice-description 조정 |