Skip to content

Instantly share code, notes, and snippets.

@max-power
Last active November 10, 2017 05:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save max-power/e0934fd70673ff900c62d8eb40eb68a4 to your computer and use it in GitHub Desktop.
Save max-power/e0934fd70673ff900c62d8eb40eb68a4 to your computer and use it in GitHub Desktop.
Phonetic Spelling: NATO, LAPD and lots more
Gem::Specification.new do |s|
s.name = 'phonetic'
s.version = '0.0.1'
s.platform = Gem::Platform::RUBY
s.author = 'Kevin Melchert'
s.email = 'kevin.melchert@gmail.com'
s.summary = 'Papa - Hotel - Oscar - November - Echo - Tango - India - Charlie - Sierra - Papa - Echo - Lima - Lima - India - November - Golf'
s.description = 'Phonetic Spelling: NATO, LAPD and lots more'
s.files = ['phonetic.rb']
s.require_path = '.'
end
module Phonetic
module Alphabet
# https://de.wikipedia.org/wiki/Buchstabiertafel
# https://en.wikipedia.org/wiki/Spelling_alphabet
NATO = {"a"=>"Alfa", "b"=>"Bravo", "c"=>"Charlie", "d"=>"Delta", "e"=>"Echo", "f"=>"Foxtrot", "g"=>"Golf", "h"=>"Hotel", "i"=>"India", "j"=>"Juliett", "k"=>"Kilo", "l"=>"Lima", "m"=>"Mike", "n"=>"November", "o"=>"Oscar", "p"=>"Papa", "q"=>"Quebec", "r"=>"Romeo", "s"=>"Sierra", "t"=>"Tango", "u"=>"Uniform", "v"=>"Victor", "w"=>"Whiskey", "x"=>"X-Ray", "y"=>"Yankee", "z"=>"Zulu"}
USFIN = {"a"=>"Adam", "b"=>"Bob", "c"=>"Carol", "d"=>"David", "e"=>"Eddie", "f"=>"Frank", "g"=>"George", "h"=>"Harry", "i"=>"Ike", "j"=>"Jim", "k"=>"Kenny", "l"=>"Larry", "m"=>"Mary", "n"=>"Nancy", "o"=>"Oliver", "p"=>"Peter", "q"=>"Quincy", "r"=>"Roger", "s"=>"Sam", "t"=>"Thomas", "u"=>"Uncle", "v"=>"Vincent", "w"=>"William", "x"=>"Xavier", "y"=>"Yogi", "z"=>"Zachary"}
LAPD = {"a"=>"Adam", "b"=>"Boy", "c"=>"Charles", "d"=>"David", "e"=>"Edward", "f"=>"Frank", "g"=>"George", "h"=>"Henry", "i"=>"Ida", "j"=>"John", "k"=>"King", "l"=>"Lincoln", "m"=>"Mary", "n"=>"Nora", "o"=>"Ocean", "p"=>"Paul", "q"=>"Queen", "r"=>"Robert", "s"=>"Sam", "t"=>"Tom", "u"=>"Union", "v"=>"Victor", "w"=>"William", "x"=>"X-ray", "y"=>"Young", "z"=>"Zebra"}
CS = {"a"=>"Adam", "b"=>"Božena", "c"=>"Cyril", "d"=>"David", "e"=>"Emil", "f"=>"František", "g"=>"Gustav", "h"=>"Helena", "i"=>"Ivan", "j"=>"Josef", "k"=>"Karel", "l"=>"Ludvik", "m"=>"Marie", "n"=>"Norbert", "o"=>"Otakar", "p"=>"Petr", "q"=>"Quido", "r"=>"Rudolf", "s"=>"Svatopluk", "t"=>"Tomáš", "u"=>"Urban", "v"=>"Václav", "w"=>"Dvojité V", "x"=>"Xaver", "y"=>"Ypsilon", "z"=>"Zuzana"}
DE = {"a"=>"Anton", "b"=>"Berta", "c"=>"Cäsar", "d"=>"Dora", "e"=>"Emil", "f"=>"Friedrich", "g"=>"Gustav", "h"=>"Heinrich", "i"=>"Ida", "j"=>"Julius", "k"=>"Kaufmann", "l"=>"Ludwig", "m"=>"Martha", "n"=>"Nordpol", "o"=>"Otto", "p"=>"Paula", "q"=>"Quelle", "r"=>"Richard", "s"=>"Samuel", "t"=>"Theodor", "u"=>"Ulrich", "v"=>"Viktor", "w"=>"Wilhelm", "x"=>"Xanthippe", "y"=>"Ypsilon", "z"=>"Zacharias", "ä"=>"Ärger", "ö"=>"Ökonom", "ü"=>"Übermut", "ß"=>"Eszett"}
DE_AT = {"a"=>"Anton", "b"=>"Berta", "c"=>"Cäsar", "d"=>"Dora", "e"=>"Emil", "f"=>"Friedrich", "g"=>"Gustav", "h"=>"Heinrich", "i"=>"Ida", "j"=>"Julius", "k"=>"Konrad", "l"=>"Ludwig", "m"=>"Martha", "n"=>"Nordpol", "o"=>"Otto", "p"=>"Paula", "q"=>"Quelle", "r"=>"Richard", "s"=>"Siegfried", "t"=>"Theodor", "u"=>"Ulrich", "v"=>"Viktor", "w"=>"Wilhelm", "x"=>"Xaver", "y"=>"Ypsilon", "z"=>"Zürich", "ä"=>"Ärger", "ö"=>"Österreich", "ü"=>"Übel", "ß"=>"Eszett" }
DE_CH = {"a"=>"Anton", "b"=>"Berta", "c"=>"Cäsar", "d"=>"Daniel", "e"=>"Emil", "f"=>"Friedrich", "g"=>"Gustav", "h"=>"Heinrich", "i"=>"Ida", "j"=>"Jakob", "k"=>"Kaiser", "l"=>"Leopold", "m"=>"Marie", "n"=>"Niklaus", "o"=>"Otto", "p"=>"Peter", "q"=>"Quasi", "r"=>"Rosa", "s"=>"Sophie", "t"=>"Theodor", "u"=>"Ulrich", "v"=>"Viktor", "w"=>"Wilhelm", "x"=>"Xaver", "y"=>"Yverdon", "z"=>"Zürich", "ä"=>"Äsch", "ö"=>"Örlikon", "ü"=>"Übermut", "ß"=>"Eszett" }
DK = {"a"=>"Anna", "å"=>"Åse", "æ"=>"Ægir", "b"=>"Bernhard", "c"=>"Cecilie", "d"=>"David", "e"=>"Erik", "f"=>"Frederik", "g"=>"Georg", "h"=>"Hans", "i"=>"Ida", "j"=>"Johan", "k"=>"Karen", "l"=>"Ludvig", "m"=>"Mari", "n"=>"Nikolaj", "o"=>"Odin", "ø"=>"Øresund", "p"=>"Peter", "q"=>"Quintus", "r"=>"Rasmus", "s"=>"Søren", "t"=>"Theodor", "u"=>"Ulla", "v"=>"Viggo", "w"=>"William", "x"=>"Xerxes", "y"=>"Yrsa", "z"=>"Zackarias"}
EL = {"α"=>"αστήρ", "β"=>"Βύρων", "γ"=>"γαλή", "δ"=>"δόξα", "ε"=>"Ερμής", "ζ"=>"Ζεύς", "η"=>"Ηρώ", "θ"=>"θεά", "ι"=>"ίσκιος", "κ"=>"κενόν", "λ"=>"λάμα", "μ"=>"μέλι", "ν"=>"ναός", "ξ"=>"Ξέρξης", "ο"=>"οσμή", "π"=>"Πέτρος", "ρ"=>"ρήγας", "σ"=>"σοφός", "τ"=>"τίγρης", "υ"=>"ύμνος", "φ"=>"Φωφώ", "χ"=>"χαρά", "ψ"=>"ψυχή", "ω"=>"ωμέγα"}
ES = {"a"=>"Antonio", "b"=>"Burgos", "c"=>"Carmen", "d"=>"Dolores", "e"=>"Enrique", "f"=>"Francia", "g"=>"Granada", "h"=>"Historia", "i"=>"Inés", "j"=>"José", "k"=>"Kilo", "l"=>"Lorenzo", "m"=>"Madrid", "n"=>"Navarra", "ñ"=>"Ñoño", "o"=>"Oviedo", "p"=>"París", "q"=>"Querido", "r"=>"Ramón", "s"=>"Sábado", "t"=>"Toledo", "u"=>"Ulises", "v"=>"Valencia", "w"=>"Washington", "x"=>"Xilófono", "y"=>"Yegua", "z"=>"Zaragoza"}
FI = {"a"=>"Aarne", "ä"=>"Äiti", "å"=>"Åke", "b"=>"Bertta", "c"=>"Celsius", "d"=>"Daavid", "e"=>"Eemeli", "f"=>"Faarao", "g"=>"Gideon", "h"=>"Heikki", "i"=>"Iivari", "j"=>"Jussi", "k"=>"Kalle", "l"=>"Lauri", "m"=>"Matti", "n"=>"Niilo", "o"=>"Otto", "ö"=>"Öljy", "p"=>"Paavo", "r"=>"Risto", "s"=>"Sakari", "t"=>"Tyyne", "u"=>"Urho", "v"=>"Vihtori", "w"=>"Wiski", "x"=>"Äksä", "y"=>"Yrjö", "z"=>"Tseta"}
FR = {"a"=>"Anatole", "b"=>"Berthe", "c"=>"Célestin", "d"=>"Désiré", "e"=>"Eugène", "f"=>"François", "g"=>"Gaston", "h"=>"Henri", "i"=>"Irma", "j"=>"Joseph", "k"=>"Kléber", "l"=>"Louis", "m"=>"Marcel", "n"=>"Nicolas", "o"=>"Oscar", "p"=>"Pierre", "q"=>"Quintal", "r"=>"Raoul", "s"=>"Suzanne", "t"=>"Thérèse", "u"=>"Ursule", "v"=>"Victor", "w"=>"William", "x"=>"Xavier", "y"=>"Yvonne", "z"=>"Zoé"}
IT = {"a"=>"Ancona", "b"=>"Bologna", "c"=>"Como", "d"=>"Domodossola", "e"=>"Empoli", "f"=>"Firenze", "g"=>"Genova", "h"=>"Hotel", "i"=>"Imola", "j"=>"Jolly", "k"=>"Kappa", "l"=>"Livorno", "m"=>"Milano", "n"=>"Napoli", "o"=>"Otranto", "p"=>"Padova", "q"=>"Quadro", "r"=>"Roma", "s"=>"Savona", "t"=>"Torino", "u"=>"Udine", "v"=>"Venezia", "w"=>"Washington", "x"=>"Xeres", "y"=>"York", "z"=>"Zara"}
NL = {"a"=>"Anna", "b"=>"Bernard", "c"=>"Cornelis", "d"=>"Dirk", "e"=>"Eduard", "f"=>"Ferdinand", "g"=>"Gerard", "h"=>"Hendrik", "i"=>"Izaak", "j"=>"Julius", "k"=>"Karel", "l"=>"Lodewijk", "m"=>"Maria", "n"=>"Nico", "o"=>"Otto", "p"=>"Pieter", "q"=>"Quotiënt", "r"=>"Richard", "s"=>"Simon", "t"=>"Theodor", "u"=>"Utrecht", "v"=>"Victor", "w"=>"Willem", "x"=>"Xanthippe", "y"=>"Ypsilon", "z"=>"Zaandam"}
NO = {"a"=>"Anna", "å"=>"Åse", "æ"=>"Ærlig", "b"=>"Bernhard", "c"=>"Caesar", "d"=>"David", "e"=>"Edith", "f"=>"Fredrik", "g"=>"Gustav", "h"=>"Harald", "i"=>"Ivar", "j"=>"Johan", "k"=>"Karin", "l"=>"Ludvig", "m"=>"Martin", "n"=>"Nils", "o"=>"Olivia", "ø"=>"Østen", "p"=>"Petter", "q"=>"Quintus", "r"=>"Rikard", "s"=>"Sigrid", "t"=>"Teodor", "u"=>"Ulrik", "v" => "Enkelt-V", "w"=> "Dobbelt-W", "x"=>"Xerxes", "y"=>"Yngling", "z"=>"Zakarias"}
PT_PT = {"a"=>"Aveiro", "b"=>"Braga", "c"=>"Coimbra", "d"=>"Dafundo", "é"=>"Évora", "f"=>"Faro", "g"=>"Guarda", "h"=>"Horta", "i"=>"Itália", "j"=>"José", "k"=>"Kodak", "l"=>"Lisboa", "m"=>"Maria", "n"=>"Nazaré", "o"=>"Ovar", "p"=>"Porto", "q"=>"Queluz", "r"=>"Rossio", "s"=>"Setúbal", "t"=>"Tavira", "u"=>"Unidade", "v"=>"Vidago", "w"=>"Waldemar", "x"=>"Xavier", "y"=>"York", "z"=>"Zulmira"}
PT_BR = {"a"=>"Amor", "b"=>"Bandeira", "c"=>"Cobra", "d"=>"Dado", "e"=>"Estrela", "f"=>"Feira", "g"=>"Goiaba", "h"=>"Hotel", "í"=>"Índio", "j"=>"José", "k"=>"Kiwi", "l"=>"Lua", "m"=>"Maria", "n"=>"Navio", "o"=>"Ouro", "p"=>"Pipa", "q"=>"Quilombo", "r"=>"Raiz", "s"=>"Saci", "t"=>"Tatu", "u"=>"Uva", "v"=>"Vitória", "w"=>"Wilson", "x"=>"Xadrez", "y"=>"Yolanda", "z"=>"Zebra"}
RO = {"a"=>"Ana", "b"=>"Barbu", "c"=>"Costică", "d"=>"Dumitru", "e"=>"Elena", "f"=>"Florică", "g"=>"Gheorghe", "h"=>"Horia", "i"=>"Ilie", "j"=>"Jean", "k"=>"Kappa", "l"=>"Lazăr", "m"=>"Maria", "n"=>"Nicolae", "o"=>"Olga", "p"=>"Petrică", "q"=>"???", "r"=>"Radu", "s"=>"Sandu", "t"=>"Tudor", "u"=>"Udrea", "v"=>"Vasile", "w"=>"Walter", "x"=>"Xenia", "y"=>"i-grec", "z"=>"Zoe"}
RU = {"а"=>"А́нна", "б"=>"Бори́с", "в"=>"Васи́лий", "г"=>"Григо́рий", "д"=>"Дми́трий", "е"=>"Еле́на", "ё"=>"Еле́на", "ж"=>"Же́ня", "з"=>"Зинаи́да", "и"=>"Ива́н", "й"=>"Ива́н кра́ткий", "к"=>"Константи́н", "л"=>"Леони́д", "м"=>"Михаи́л", "н"=>"Никола́й", "о"=>"О́льга", "п"=>"Па́вел", "р"=>"Рома́н", "с"=>"Семён", "т"=>"Татья́на", "у"=>"Улья́на", "ф"=>"Фёдор", "х"=>"Харито́н", "ц"=>"ца́пля", "ч"=>"челове́к", "ш"=>"Шу́ра", "щ"=>"щу́ка", "ъ"=>"твёрдый знак", "ы"=>"е́ры", "ь"=>"мя́гкий знак", "э"=>"э́хо", "ю"=>"Ю́рий", "я"=>"Я́ков"}
SE = {"a"=>"Adam", "ä"=>"Ärlig", "å"=>"Åke", "b"=>"Bertil", "c"=>"Caesar", "d"=>"David", "e"=>"Erik", "f"=>"Filip", "g"=>"Gustav", "h"=>"Helge", "i"=>"Ivar", "j"=>"Johan", "k"=>"Kalle", "l"=>"Ludvig", "m"=>"Martin", "n"=>"Niklas", "o"=>"Olof", "ö"=>"Östen", "p"=>"Petter", "q"=>"Quintus", "r"=>"Rudolf", "s"=>"Sigurd", "t"=>"Tore", "u"=>"Urban", "ü"=>"Übel", "v"=>"Viktor", "w"=>"Wilhelm", "x"=>"Xerxes", "y"=>"Yngve", "z"=>"Zäta"}
SL = {"a"=>"Ankaran", "b"=>"Bled", "c"=>"Celje", "č"=>"Čatež", "d"=>"Drava", "e"=>"Evropa", "f"=>"Fala", "g"=>"Gorica", "h"=>"Hrastnik", "i"=>"Izola", "j"=>"Jadran", "k"=>"Kamnik", "l"=>"Ljubljana", "m"=>"Maribor", "n"=>"Nanos", "o"=>"Ormož", "p"=>"Piran", "q"=>"Queen", "r"=>"Ravne", "s"=>"Soča", "š"=>"Šmarje", "t"=>"Triglav", "u"=>"Unec", "v"=>"Velenje", "w"=>"Dvojni v", "x"=>"Iks", "y"=>"Ipsilon", "z"=>"Zalog", "ž"=>"Žalec"}
TR = {"a"=>"Adana", "b"=>"Bolu", "c"=>"Ceyhan", "ç"=>"Çanakkale", "d"=>"Denizli", "e"=>"Edirne", "f"=>"Fatsa", "g"=>"Giresun", "ğ"=>"Yumuşak G", "h"=>"Hatay", "i"=>"Isparta", "i̇"=>"İzmir", "j"=>"Jandarma", "k"=>"Kars", "l"=>"Lüleburgaz", "m"=>"Muş", "n"=>"Niğde", "o"=>"Ordu", "ö"=>"Ödemiş", "p"=>"Polatlı", "r"=>"Rize", "s"=>"Sinop", "ş"=>"Şırnak", "t"=>"Tokat", "u"=>"Uşak", "ü"=>"Ünye", "v"=>"Van", "y"=>"Yozgat", "z"=>"Zonguldak"}
end
class Speller
def initialize(alphabet=Alphabet::NATO)
@alphabet = alphabet
end
def spell(message)
@alphabet.values_at(*message.downcase.chars).compact
end
end
class Speaker
def initialize(voice)
@voice = voice
end
def say(message)
%x(say "#{message}" -v #{@voice})
end
end
end
# gem 'phonetic', git: 'git://gist.github.com/e0934fd70673ff900c62d8eb40eb68a4.git'
# require 'phonetic'
msg = Phonetic::Speller.new.spell('WTF')
puts msg.join(' - ') # 'Whiskey - Tango - Foxtrot'
msg = Phonetic::Speller.new(Phonetic::Alphabet::DE).spell('ABC')
puts msg.join(', ') # 'Anton, Berta, Cäsar'
# Make your own Alphabet
binary_alphabet = ('A'..'Z').map { |a| [a.downcase, a.ord.to_s(2)] }.to_h
Phonetic::Speller.new(binary_alphabet).spell('ABC').join # "100000110000101000011"
# Say it! (macOS only)
Phonetic::Speaker.new('Anna').say(msg)
dutch_speakers = %w(Xander Ellen).map { |v| Phonetic::Speaker.new(v) }.cycle
Phonetic::Alphabet::NL.each_value { |word| dutch_speakers.next.say(word) }
spanish_speakers = %w(Diego Jorge Juan Monica Paulina).map { |v| Phonetic::Speaker.new(v) }
Phonetic::Alphabet::ES.each_value { |word| spanish_speakers.sample.say(word) }
Name Locale Introduction Sentence
Alex en_US Most people recognize me by my voice.
Alice it_IT Salve, mi chiamo Alice e sono una voce italiana.
Alva sv_SE Hej, jag heter Alva. Jag är en svensk röst.
Amelie fr_CA Bonjour, je m’appelle Amelie. Je suis une voix canadienne.
Anna de_DE Hallo, ich heiße Anna und ich bin eine deutsche Stimme.
Carmit he_IL שלום. קוראים לי כרמית, ואני קול בשפה העברית.
Damayanti id_ID Halo, nama saya Damayanti. Saya berbahasa Indonesia.
Daniel en_GB Hello, my name is Daniel. I am a British-English voice.
Diego es_AR Hola, me llamo Diego y soy una voz española.
Ellen nl_BE Hallo, mijn naam is Ellen. Ik ben een Belgische stem.
Fiona en-scotland Hello, my name is Fiona. I am a Scottish-English voice.
Fred en_US I sure like being inside this fancy computer
Ioana ro_RO Bună, mă cheamă Ioana . Sunt o voce românească.
Joana pt_PT Olá, chamo-me Joana e dou voz ao português falado em Portugal.
Jorge es_ES Hola, me llamo Jorge y soy una voz española.
Juan es_MX Hola, me llamo Juan y soy una voz mexicana.
Kanya th_TH สวัสดีค่ะ ดิฉันชื่อKanya
Karen en_AU Hello, my name is Karen. I am an Australian-English voice.
Kyoko ja_JP こんにちは、私の名前はKyokoです。日本語の音声をお届けします。
Laura sk_SK Ahoj. Volám sa Laura . Som hlas v slovenskom jazyku.
Lekha hi_IN नमस्कार, मेरा नाम लेखा है.Lekha मै हिंदी मे बोलने वाली आवाज़ हूँ.
Luca it_IT Salve, mi chiamo Luca e sono una voce italiana.
Luciana pt_BR Olá, o meu nome é Luciana e a minha voz corresponde ao português que é] falado no Brasil
Maged ar_SA مرحبًا اسمي Maged. أنا عربي من السعودية.
Mariska hu_HU Üdvözlöm! Mariska vagyok. Én vagyok a magyar hang.
Mei-Jia zh_TW 您好,我叫美佳。我說國語。
Melina el_GR Γεια σας, ονομάζομαι Melina. Είμαι μια ελληνική φωνή.
Milena ru_RU Здравствуйте, меня зовут Milena. Я – русский голос системы.
Moira en_IE Hello, my name is Moira. I am an Irish-English voice.
Monica es_ES Hola, me llamo Monica y soy una voz española.
Nora nb_NO Hei, jeg heter Nora. Jeg er en norsk stemme.
Paulina es_MX Hola, me llamo Paulina y soy una voz mexicana.
Samantha en_US Hello, my name is Samantha. I am an American-English voice.
Sara da_DK Hej, jeg hedder Sara. Jeg er en dansk stemme.
Satu fi_FI Hei, minun nimeni on Satu. Olen suomalainen ääni.
Sin-ji zh_HK 您好,我叫 Sin-ji。我講廣東話。
Tessa en_ZA Hello, my name is Tessa. I am a South African-English voice.
Thomas fr_FR Bonjour, je m’appelle Thomas. Je suis une voix française.
Ting-Ting zh_CN 您好,我叫Ting-Ting。我讲中文普通话。
Veena en_IN Hello, my name is Veena. I am an Indian-English voice.
Victoria en_US Isn't it nice to have a computer that will talk to you?
Xander nl_NL Hallo, mijn naam is Xander. Ik ben een Nederlandse stem.
Yelda tr_TR Merhaba, benim adım Yelda. Ben Türkçe bir sesim.
Yuna ko_KR 안녕하세요. 제 이름은 Yuna입니다. 저는 한국어 음성입니다.
Yuri ru_RU Здравствуйте, меня зовут Yuri. Я – русский голос системы.
Zosia pl_PL Witaj. Mam na imię Zosia, jestem głosem kobiecym dla języka polskiego.
Zuzana cs_CZ Dobrý den, jmenuji se Zuzana. Jsem český hlas.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment