소프트웨어 자동 입 - 작은 음성 합성기
이것은 Great Sam Speech Synthesizer의 이동 항구입니다. 기본적으로 C에서 반자동을 다시 쓰는 것입니다. 결과적으로 이것은 읽을 수있는 것이 아닙니다.
원래 리포 : https://github.com/vidarh/sam. 이 커밋을 기반으로합니다.
도전과 재미를 위해.
Sam은 가장 인기있는 플랫폼에서 실행되는 C로 작성된 매우 작은 TTS (Trem 텍스트 음성 연설) 프로그램입니다. 1982 년에 출판 된 Commodore C64에 대한 Speech Software SAM (소프트웨어 자동 구강)의 C에 대한 적응입니다. 여기에는 Recier라는 텍스트-포임 변환기와 최종 출력을위한 음소-음성 연설 루틴이 포함됩니다. 너무 작아서 내장 된 컴퓨터에서도 작동합니다. 내 컴퓨터에서는 디스크 공간의 39KB 미만 (실행 가능 장치가 필요하지 않기 때문에 훨씬 작음)이 필요하며 완전히 독립형 프로그램입니다. 즉각적인 출력의 경우 SDL-Library를 사용하면 .wav 파일을 저장할 수 있습니다.
Windows 용 온라인 버전 및 실행 파일은 웹 사이트에서 찾을 수 있습니다 : http://simulationcorner.net/index.php?page=sam
명령 프롬프트에 "make"를 입력하기 만하면됩니다. SDL없이 컴파일하려면 "makefile"파일에서 CFLAG 및 LFLAGS 변수에서 SDL 문을 제거하십시오.
모든 UNIX와 같은 운영 체제에서 컴파일해야합니다. Windows의 경우 Cygwin 또는 Mingw ( + libsdl)가 필요합니다.
유형
./sam I am Sam
첫 번째 출력.
SDL을 비활성화 한 경우 시도해보십시오
./sam -wav i_am_sam.wav I am Sam
WAV 파일을 얻으려면. 이 파일은 PC에서 사용할 수있는 많은 미디어 플레이어가 재생할 수 있습니다.
-Pitch Number -Speed Number -Throat 번호와 같은 다른 옵션을 시도 할 수 있습니다.
원래 매뉴얼에 작성된 몇 가지 일반적인 값은 다음과 같습니다.
DESCRIPTION SPEED PITCH THROAT MOUTH
Elf 72 64 110 160
Little Robot 92 60 190 190
Stuffy Guy 82 72 110 105
Little Old Lady 82 32 145 145
Extra-Terrestrial 100 64 150 200
SAM 72 64 128 128
작은 예를 위해 "노래"파일을 보면 노래 할 수도 있습니다.
음소 입력 테이블의 경우 Wiki를보십시오.
추가 기능에 대한 설명은 원본 설명서에서 http://www.retrobits.net/atari/sam.shtml (동등한 Apple II 프로그램 매뉴얼 http://www.apple-iigs.info/newdoc/sam.pdf)에서 찾을 수 있습니다.
이 프로그램은 각 어셈블러 Opcode를 변환하여 반자동을 C로 변환했습니다. 예를 들어
lda 56 => A = mem[56];
jmp 38018 => goto pos38018;
inc 38 => mem[38]++;
. .
. .
그런 다음 코드의 대부분의 점프 및 등록 변수를 제거하고 변수의 이름을 올바른 이름으로 바꾸도록 수동으로 다시 작성되었습니다. 아래 설명의 대부분은이 재 작성 프로세스의 결과입니다.
불행히도 여전히 읽기 쉬운 것은 아닙니다. 그러나 당신은 내가 어디서 시작했는지 볼 수 있어야합니다 :)
우선 나는 여기서 매우 거친 설명으로 여기를 제한 할 것입니다. 소스 코드에는 설명하지 않을 예외가 많이 있습니다. 또한 Code47503에 대한 많은 코드가 알려져 있지 않습니다. 코드를 완전히 이해하려면 더 많은 시간이 필요하고 특히 더 많은 눈이 코드를 살펴 봅니다.
위키에 표시된 규칙 세트에 의해 영어 텍스트를 음소로 변경합니다.
규칙 "ant (i)", "ay"는 이전 문자 "개미"가있는 "i"를 찾으면 I를 음소 "ay"로 교환한다는 것을 의미합니다.
이 규칙에는 # & @ ^ + : %와 같은 특별한 징후가 있습니다. 즉, 보컬이나 자음이나 다른 것이 있어야한다는 의미 일 수 있습니다.
-debug 옵션을 사용하면 해당 규칙과 결과적인 음소가 나타납니다.
다음은 서브 루틴 통화의 전체 트리입니다.
sammain () parser1 () parser2 () insert () copystress () setphonemelength () code48619 () code41240 () insert () code48431 () insert ()
Code48547
Code47574
Special1
Code47503
Code48227
Sammain ()은 입력 루틴이며 모든 추가 루틴을 호출합니다. Parser1은 음소 입력을 변환하고이를 3 개의 테이블로 변환합니다.
이 테이블은 이제 변경되었습니다.
Parser2는 다른 사람에 의해 일부 음소를 교환하고 새로운 삽입을합니다. COPYSTRESS는 어떤 상황에서 스트레스에 1을 추가합니다. setPhoneMelength는 음소 길이를 설정합니다. Code48619 변경 음소 길이 변경 Code41240 추가 음운물 추가 코드 48431은 몇 가지 추가 규칙이 있습니다.
위키는 가능한 모든 음소와 일부 깃발 필드를 보여줍니다.
이 테이블의 최종 내용은 -debug 명령으로 볼 수 있습니다.
함수에서 repayOutput () 에서이 테이블은 부분적으로 작은 테이블로 복사됩니다 : phonemeIndexOutput [] crestoutput [] phoneMELENGTHOUTPUT [] 출력.
일부 특수한 음소를 제외하고 출력은 선형 조합으로 구축됩니다.
A = A1 * sin ( f1 * t ) +
A2 * sin ( f2 * t ) +
A3 * rect( f3 * t )
여기서 직장은 죄와 같은 주기성을 가진 직사각형 기능입니다. 정말 이상해 보이지만 이것은 대부분의 유형의 음소에 충분합니다.
따라서 위의 음소는 일부 테이블로 피치로 변환되어 [] 주파수 1 [] = f1 주파수 2 [] = f2 주파수 3 [] = f3 진폭 1 [] = a1 admplitude2 [] = a2 admplitude3 [] = a3
위의 공식은 매우 좋은 omptimized 루틴으로 계산됩니다. 26 개의 명령으로 만 구성됩니다.
48087: LDX 43 ; get phase
CLC
LDA 42240,x ; load sine value (high 4 bits)
ORA TabAmpl1,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
STA 56 ; store
LDX 42 ; get phase
LDA 42240,x ; load sine value (high 4 bits)
ORA TabAmpl2,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
ADC Var56 ; add with previous values
STA 56 ; and store
LDX 41 ; get phase
LDA 42496,x ; load rect value (high 4 bits)
ORA TabAmpl3,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
ADC 56 ; add with previous values
ADC #136
LSR A ; get highest 4 bits
LSR A
LSR A
LSR A
STA 54296 ;SID main output command
나머지는 특별한 방식으로 처리됩니다. 현재 나는 어떤 식 으로든 알아낼 수 없습니다. 그러나 임의의 값을 가진 테이블을 사용하여 약간의 노이즈 (예 : "S")를 사용하는 것 같습니다.
이 소프트웨어는 30 년 전에 출판 된 상용 소프트웨어의 역 엔지니어링 버전입니다. 현재 저작권 보유자는 SoftVoice, Inc. (www.text2speech.com)입니다.
회사에 연락하려는 시도는 실패했습니다. 웹 사이트는 2009 년에 마지막으로 업데이트되었습니다. 따라서 원래 소프트웨어의 상태는 PobandonWare (http://en.wikipedia.org/wiki/abandonware)로 가장 잘 설명 될 수 있습니다.
이 경우 특정 오픈 소스 소프트웨어 라이센스에 내 코드를 넣을 수없는 경우 자신의 위험에 따라 사용합니다.
질문이 있으시면 주저하지 말아주세요. 코드에 대한 새로운 지식을 발견했다면 저에게 메일을 보내주십시오.
Sebastian Macke 이메일 : [email protected]