jun-wiki

View My GitHub Profile

Posts (Latest 10 updated) :
Read all
Contents:
  1. tts 품질 이슈
  2. 파이프라인 개설
    1. 필요
      1. tts 파이프라인

tts 품질 이슈

tts 자꾸 찐빠 내길래 원인 알아보았다

tts 이슈니까 당연히 tts 의심했다

세그먼트 하나를 3번 연속 말하거나 영어 쓰고 이상한 말하면 당연히 tts 부터 의심해봐야 한다

tts 청크 단위로 쪼개고 합쳐질때 찐빠 나는 줄 알았는데 전혀 아닌 모양이다

이리저리 바꾸고 하나만 쓰게 하고 뭐하고 해도 찐빠가 여전했으니

문제 원인은

보이스 샘플이었다

보이스 샘플 로직이 영 별로라 아무거나 선정하는데 그러할 시 바로 찐빠난다

그래서 보이스 샘플 로직 수정했다


일단 기본적으로 화자, 텍스트가 구분된 세그먼트여야 한다

그리고 세그먼트 길이가 3초 이하거나 15초 이상이면 제외된다

이렇게 1차적으로 후보 간추린다


이후, fast-whisper의 발음 명확도와 음성 밀도를 7:3으로 섞는다

음성 분리하고 뭐하고 하는 과정에 기록해둔 값들이다

발음 명확도: 다음에 나올 텍스트 토큰 확률을 구하고 이로 표현한 평균값

음성 밀도: 전체 길이 대비 무음 구간

이 둘을 7:3으로 섞은게 컨텐츠 점수다


추가로 길이 점수도 준비해준다

6초에 가까울수록 추가 점수다

가우시안 형태말고 보다 명확한 삼각형 형태로 계산했다


마지막으로 컨텐츠 점수와 길이 점수를 3.5 : 6.5로 섞어주면 최종 점수 완성이다

후보 중에서 이거 점수 가장 높은애가 샘플 보이스로 선택된다

찐빠가 상당히 감소했다 👍


파이프라인 개설

풀 파이프라인
asr->translate->tts->sync->mux

기존에는 풀 파이프라인 하나라 다른 처리가 안됐다

그래서 더 만들어줄테다

먼저 필요한 파이프라인을 정리해야한다


필요

  • tts 파이프라인

    • 그냥 번역 텍스트 수정해서 반영 위해

    • 보컬 트랙 변경해서

    • 보컬 트랙 샘플 오디오 바꿔서

    • 세그먼트 병합 후 반영 위해

    • 세그먼트 분할 후 반영 위해

    • 보이스 토큰 활용 위해?

  • 재번역

    • 걍 백엔드 쪽에서 해도 될듯
  • sync 해주는 파이프라인

    • 정적으로 tts 재생성해줄때 거치게 해주는 용도

      • 걍 어지간하면 다 tts랑 세트임 (동적 잿애성 제외)
  • mux 해주는 파이프 라인

    • 최종 영상 합성해서 보내줄때 (DB에 저장된 데이터로 최종 합성해줄때 다시 사용할듯)


파이프 라인 꽤 필요하다 tts부터 좀 더 자세히 뜯어봐야 할 듯 하다


tts 파이프라인

{
  "task": "tts 작업",
  "project_id": "프로젝트 id",
  "job_id": "작업 id",            // 풀파이프라인 돌때 job_id
  "callback_url": "https://...",  // 결과 콜백
  "target_lang": "목표 언어",
  "mod": "fixed/dynamic",         // 동적 생성 or 정적 생성

  "speaker_voices": {
    "key": "voice-samples/spk00.wav",
    "text_prompt": "voice-samples/spk00.json" // 샘플 오디오에 해당하는 원문 텍스트 위치
  },

  // 여러 세그먼트를  번에 처리할  있게 미리 확장
  "segments": [
    {
      "text": "새로 번역된 문장입니다.",
      "s": 12.34,                 // 세그먼트 시작
      "e": 15.32                  // 세그먼트 
    },
    {
      "text": "두 번째 화자의 수정된 번역입니다.",
      "s": 18.02,T
      "e": 21.57
    }
  ]
}

메시지 스키마다 이렇게 구상한 이유는

힙하게 처리 위해서다

구라고 메시지 하나당 세그먼트 하나씩 tts 하려면 상당히 비효율적이라 한번에 여러 세그먼트도 처리 가능하게 구상해봤다