ซอฟต์แวร์ Automatic Mouth - Synthesizer คำพูดเล็ก ๆ
นี่คือพอร์ต GO ของ Great Sam Speech Synthesizer โดยพื้นฐานแล้วมันเป็นการเขียนซ้ำกึ่งอัตโนมัติจาก C ไปยังสิ่งที่เป็นในทางกลับกันการเขียนซ้ำกึ่งอัตโนมัติจากการชุมนุมถึง C :) ดังนั้นสิ่งนี้ไม่ได้หมายถึงการอ่านได้
repo ดั้งเดิม: https://github.com/vidarh/sam ขึ้นอยู่กับการกระทำนี้
เป็นความท้าทายและเพื่อความสนุกสนาน
SAM เป็นโปรแกรม Text-to-Speech (TTS) ขนาดเล็กมากที่เขียนใน C ซึ่งทำงานบนแพลตฟอร์มที่ได้รับความนิยมมากที่สุด เป็นการปรับตัวให้เข้ากับ C ของซอฟต์แวร์คำพูด SAM (Software Automatic Mouth) สำหรับ Commodore C64 ที่เผยแพร่ในปี 1982 โดย Don't Ask Software (ตอนนี้ SoftVoice, Inc. ) มันมีตัวแปลงข้อความเป็น phoneme ที่เรียกว่า Reciter และรูทีนฟอนิมถึงพูดสำหรับเอาต์พุตสุดท้าย มันเล็กมากจนมันจะใช้งานได้กับคอมพิวเตอร์ที่ฝังตัว ในคอมพิวเตอร์ของฉันใช้เวลาน้อยกว่า 39KB (มีขนาดเล็กลงบนอุปกรณ์ฝังตัวเนื่องจากไม่จำเป็นต้องมีการเรียกใช้งาน-หัว) ของพื้นที่ดิสก์และเป็นโปรแกรมแบบสแตนด์อโลนอย่างเต็มที่ สำหรับเอาต์พุตทันทีใช้ SDL-Library มิฉะนั้นจะสามารถบันทึกไฟล์. wav ได้
สามารถพบเวอร์ชันออนไลน์และ Executables สำหรับ Windows บนเว็บไซต์: http://simulationcorner.net/index.php?page=sam
เพียงพิมพ์ "ทำ" ในพรอมต์คำสั่งของคุณ เพื่อที่จะรวบรวมโดยไม่ต้องใช้ SDL ลบคำสั่ง SDL ออกจากตัวแปร CFLAGS และ LFLAGS ในไฟล์ "MakeFile"
ควรรวบรวมทุกระบบปฏิบัติการแบบ UNIX ทุกระบบ สำหรับ Windows คุณต้องใช้ Cygwin หรือ Mingw ( + Libsdl)
พิมพ์
./sam I am Sam
สำหรับผลลัพธ์แรก
หากคุณปิดใช้งาน SDL ลอง
./sam -wav i_am_sam.wav I am Sam
เพื่อรับไฟล์ WAV ไฟล์นี้สามารถเล่นได้โดยเครื่องเล่นสื่อจำนวนมากที่มีให้สำหรับพีซี
คุณสามารถลองตัวเลือกอื่น ๆ เช่น -pitch Number -speed Number -หมายเลข throat -number -number
ค่าทั่วไปบางอย่างที่เขียนในคู่มือดั้งเดิมคือ:
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
มันสามารถร้องเพลงดูไฟล์ "ร้องเพลง" สำหรับตัวอย่างเล็ก ๆ
สำหรับตารางอินพุตฟอนิมในวิกิ
คำอธิบายของคุณสมบัติเพิ่มเติมสามารถพบได้ในคู่มือดั้งเดิมที่ http://www.retrobits.net/atari/sam.shtml หรือในคู่มือของโปรแกรม Apple II ที่เทียบเท่า
โปรแกรมนี้ถูกแปลงกึ่งอัตโนมัติเป็น C โดยการแปลง Opcode แอสเซมเบลอร์แต่ละตัว เช่น
lda 56 => A = mem[56];
jmp 38018 => goto pos38018;
inc 38 => mem[38]++;
. .
. .
จากนั้นมันก็ถูกเขียนใหม่ด้วยตนเองเพื่อลบการกระโดดส่วนใหญ่และลงทะเบียนตัวแปรในรหัสและเปลี่ยนชื่อตัวแปรเป็นชื่อที่เหมาะสม คำอธิบายส่วนใหญ่ด้านล่างเป็นผลมาจากกระบวนการเขียนใหม่นี้
น่าเสียดายที่มันยังไม่ดีนักอ่านได้ แต่คุณควรเห็นว่าฉันเริ่มต้นที่ไหน :)
ก่อนอื่นฉันจะ จำกัด ตัวเองที่นี่เป็นคำอธิบายที่หยาบมาก มีข้อยกเว้นมากมายที่กำหนดไว้ในซอร์สโค้ดที่ฉันจะไม่อธิบาย นอกจากนี้ยังไม่ทราบรหัสจำนวนมากสำหรับฉัน EG CODE47503 เพื่อความเข้าใจที่สมบูรณ์เกี่ยวกับรหัสฉันต้องการเวลามากขึ้นและโดยเฉพาะอย่างยิ่งดวงตาที่ดูรหัส
มันเปลี่ยนข้อความภาษาอังกฤษเป็นหน่วยเสียงโดยชุดกฎที่แสดงในวิกิ
กฎ "ant (i)", "ay", หมายความว่าถ้าเขาพบ "ฉัน" ด้วยตัวอักษรก่อนหน้านี้ "ant", แลกเปลี่ยน i โดย phoneme "ay"
มีสัญญาณพิเศษบางอย่างในกฎนี้เช่น # & @ ^ +: % ซึ่งอาจหมายถึงเช่นนั้นจะต้องมีแกนนำหรือพยัญชนะหรืออย่างอื่น
ด้วยตัวเลือก -Debug คุณจะได้รับกฎที่เกี่ยวข้องและหน่วยเสียงที่เกิดขึ้น
นี่คือต้นไม้สายเต็มของสายย่อย:
sammain () parser1 () parser2 () แทรก () copystress () setphonemelength () code48619 () code41240 () แทรก () code48431 () แทรก ()
Code48547
Code47574
Special1
Code47503
Code48227
Sammain () เป็นรูทีนรายการและเรียกกิจวัตรประจำวันทั้งหมด parser1 แปลงอินพุตฟอนิมและแปลงเป็นสามตาราง phonemeindex [] ความเครียด [] phonemelength [] (ศูนย์ในขณะนี้)
ตารางนี้เปลี่ยนไปแล้ว:
Parser2 แลกเปลี่ยนหน่วยเสียงบางส่วนโดยผู้อื่นและแทรกใหม่ Copystress เพิ่ม 1 ให้กับความเครียดในบางสถานการณ์ setphonemelength ตั้งค่าความยาวฟอนิม code48619 เปลี่ยนความยาวฟอนิม Code41240 เพิ่มหน่วยเสียงเพิ่มเติม Code48431 มีกฎพิเศษบางอย่าง
วิกิแสดงหน่วยเสียงที่เป็นไปได้ทั้งหมดและฟิลด์บางฟิลด์
เนื้อหาสุดท้ายของตารางเหล่านี้สามารถเห็นได้ด้วยคำสั่ง -Debug
ในฟังก์ชั่น prepefutput () ตารางเหล่านี้ถูกคัดลอกบางส่วนลงในตารางเล็ก ๆ : phonemeindexoutput [] stressoutput [] phonemelengthutput [] สำหรับเอาต์พุต
ยกเว้นหน่วยเสียงพิเศษบางอย่างเอาต์พุตถูกสร้างขึ้นโดยการรวมกันเชิงเส้น:
A = A1 * sin ( f1 * t ) +
A2 * sin ( f2 * t ) +
A3 * rect( f3 * t )
โดยที่รูปสี่เหลี่ยมผืนผ้าเป็นฟังก์ชั่นรูปสี่เหลี่ยมผืนผ้าที่มีช่วงเวลาเดียวกันเช่นบาป ดูเหมือนแปลกจริงๆ แต่นี่ก็เพียงพอแล้วสำหรับหน่วยเสียงส่วนใหญ่
ดังนั้นหน่วยเสียงข้างต้นจะถูกแปลงด้วยตารางบางส่วนเป็นสนาม [] ความถี่ 1 [] = F1 ความถี่ 2 [] = F2 ความถี่ 3 [] = F3 แอมพลิจูด 1 [] = A1 แอมพลิจูด 2 [] = A2 แอมพลิจูด 3 [] = A3
สูตรข้างต้นคำนวณในกิจวัตรที่ดีมาก ประกอบด้วยเพียง 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)
ความพยายามใด ๆ ที่จะติดต่อ บริษัท ล้มเหลว เว็บไซต์ได้รับการอัปเดตล่าสุดในปี 2552 สถานะของซอฟต์แวร์ต้นฉบับสามารถอธิบายได้ดีที่สุดว่าเป็นตัวทิ้ง (http://en.wikipedia.org/wiki/abandonware)
ตราบใดที่นี่เป็นกรณีที่ฉันไม่สามารถใส่รหัสของฉันภายใต้ใบอนุญาตซอฟต์แวร์โอเพ่นซอร์สเฉพาะใด ๆ ใช้มันตามความเสี่ยงของคุณเอง
หากคุณมีคำถามไม่ลังเลที่จะถามฉัน หากคุณค้นพบความรู้ใหม่เกี่ยวกับรหัสโปรดส่งอีเมลถึงฉัน
Sebastian Macke อีเมล: [email protected]