If no keyboard layout is available, mapping a font in xelatex is possible.
The decision is what alias (string) to give to each glyph. There are a lot of glyphs, and optimally, typing should be minimised.
One method is to use IPA numbers as the alias, similar to how Egyptian hieroglyphs have a numbering scheme:

(Source of IPA numbers: Wikipedia)
but the list is arbitrary, and it is tedious to type the alias text.
Slightly less tedious, but more conceptually powerful, is a coordinate method, down-and-across Cartesian-like, where the alias shortcut is named for the articulation position:

This could be filled in with the composite characters easily (and the accents and diacritic marks).
And it becomes almost a music-like notation, allowing later visualisation through time of the utterance. It also focuses the minds of the students on the sound source like an actual map, rather than embedding an arbitrary visual sign as an extra layer of cognitive load.
.map file
; TECkit mapping for TeX input conventions <-> Unicode characters
LHSName "ipacoord-to-ipa"
RHSName "UNICODE"
pass(Unicode)
; ligatures from Knuth's original CMR fonts
U+002D U+002D <> U+2013 ; -- -> en dash
U+002D U+002D U+002D <> U+2014 ; --- -> em dash
U+0027 <> U+2019 ; ' -> right single quote
U+0027 U+0027 <> U+201D ; '' -> right double quote
U+0022 > U+201D ; " -> right double quote
U+0060 <> U+2018 ; ` -> left single quote
U+0060 U+0060 <> U+201C ; `` -> left double quote
U+0021 U+0060 <> U+00A1 ; !` -> inverted exclam
U+003F U+0060 <> U+00BF ; ?` -> inverted question
; additions supported in T1 encoding
U+002C U+002C <> U+201E ; ,, -> DOUBLE LOW-9 QUOTATION MARK
U+003C U+003C <> U+00AB ; << -> LEFT POINTING GUILLEMET
U+003E U+003E <> U+00BB ; >> -> RIGHT POINTING GUILLEMET
;=====================================
U+0076 U+0031 U+0031 U+0075 <> U+0069; v11u i
U+0076 U+0031 U+0031 U+0072 <> U+0079; v11r y
U+0076 U+0031 U+0032 U+0075 <> U+0268; v12u ɨ
U+0076 U+0031 U+0032 U+0072 <> U+0289; v12r ʉ
U+0076 U+0031 U+0033 U+0075 <> U+026F; v13u ɯ
U+0076 U+0031 U+0033 U+0072 <> U+0075; v13r u
U+0076 U+0032 U+0031 U+0075 <> U+026A; v21u ɪ
U+0076 U+0032 U+0031 U+0072 <> U+028F; v21r ʏ
U+0076 U+0032 U+0033 U+0072 <> U+028A; v23r ʊ
U+0076 U+0033 U+0031 U+0075 <> U+0065; v31u e
U+0076 U+0033 U+0031 U+0072 <> U+00F8; v31r ø
U+0076 U+0033 U+0032 U+0075 <> U+0258; v32u ɘ
U+0076 U+0033 U+0032 U+0072 <> U+0275; v32r ɵ
U+0076 U+0033 U+0033 U+0075 <> U+0264; v33u ɤ
U+0076 U+0033 U+0033 U+0072 <> U+006F; v33r o
U+0076 U+0034 U+0032 U+0072 <> U+0259; v42r ə
U+0076 U+0035 U+0031 U+0075 <> U+025B; v51u ɛ
U+0076 U+0035 U+0031 U+0072 <> U+0153; v51r œ
U+0076 U+0035 U+0032 U+0075 <> U+025C; v52u ɜ
U+0076 U+0035 U+0032 U+0072 <> U+025E; v52r ɞ
U+0076 U+0035 U+0033 U+0075 <> U+028C; v53u ʌ
U+0076 U+0035 U+0033 U+0072 <> U+0254; v53r ɔ
U+0076 U+0036 U+0031 U+0072 <> U+00E6; v61r æ
U+0076 U+0036 U+0032 U+0072 <> U+0250; v62r ɐ
U+0076 U+0037 U+0031 U+0075 <> U+0061; v71u a
U+0076 U+0037 U+0031 U+0072 <> U+0276; v71r ɶ
U+0076 U+0037 U+0033 U+0075 <> U+0251; v73u ɑ
U+0076 U+0037 U+0033 U+0072 <> U+0252; v73r ɒ
U+006B U+0031 U+0031 <> U+0062; k11 b
U+006B U+0031 U+0034 <> U+0064; k14 d
U+006B U+0031 U+0036 <> U+0256; k16 ɖ
U+006B U+0031 U+0037 <> U+025F; k17 ɟ
U+006B U+0031 U+0038 <> U+0261; k18 ɡ
U+006B U+0031 U+0039 <> U+0262; k19 ɢ
U+006B U+0031 U+0042 <> U+00A0; k1B
U+006B U+0032 U+0031 <> U+006D; k21 m
U+006B U+0032 U+0032 <> U+0271; k22 ɱ
U+006B U+0032 U+0034 <> U+006E; k24 n
U+006B U+0032 U+0036 <> U+0273; k26 ɳ
U+006B U+0032 U+0037 <> U+0272; k27 ɲ
U+006B U+0032 U+0038 <> U+014B; k28 ŋ
U+006B U+0032 U+0039 <> U+0274; k29 ɴ
U+006B U+0033 U+0031 <> U+0299; k31 ʙ
U+006B U+0033 U+0034 <> U+0072; k34 r
U+006B U+0033 U+0039 <> U+0280; k39 ʀ
U+006B U+0034 U+0032 <> U+2C71; k42 ⱱ
U+006B U+0034 U+0034 <> U+027E; k44 ɾ
U+006B U+0034 U+0036 <> U+027D; k46 ɽ
U+006B U+0035 U+0031 <> U+03B2; k51 β
U+006B U+0035 U+0032 <> U+0076; k52 v
U+006B U+0035 U+0033 <> U+00F0; k53 ð
U+006B U+0035 U+0034 <> U+007A; k54 z
U+006B U+0035 U+0035 <> U+0292; k55 ʒ
U+006B U+0035 U+0036 <> U+0290; k56 ʐ
U+006B U+0035 U+0037 <> U+029D; k57 ʝ
U+006B U+0035 U+0038 <> U+0263; k58 ɣ
U+006B U+0035 U+0039 <> U+0281; k59 ʁ
U+006B U+0035 U+0041 <> U+0295; k5A ʕ
U+006B U+0035 U+0042 <> U+0266; k5B ɦ
U+006B U+0036 U+0034 <> U+026E; k64 ɮ
U+006B U+0037 U+0032 <> U+028B; k72 ʋ
U+006B U+0037 U+0034 <> U+0279; k74 ɹ
U+006B U+0037 U+0036 <> U+027B; k76 ɻ
U+006B U+0037 U+0037 <> U+006A; k77 j
U+006B U+0037 U+0038 <> U+0270; k78 ɰ
U+006B U+0038 U+0034 <> U+006C; k84 l
U+006B U+0038 U+0036 <> U+026D; k86 ɭ
U+006B U+0038 U+0037 <> U+028E; k87 ʎ
U+006B U+0038 U+0038 <> U+029F; k88 ʟ
U+006B U+0031 U+0031 U+0075 <> U+0070; k11u p
U+006B U+0031 U+0034 U+0075 <> U+0074; k14u t
U+006B U+0031 U+0036 U+0075 <> U+0288; k16u ʈ
U+006B U+0031 U+0037 U+0075 <> U+0063; k17u c
U+006B U+0031 U+0038 U+0075 <> U+006B; k18u k
U+006B U+0031 U+0039 U+0075 <> U+0071; k19u q
U+006B U+0031 U+0042 U+0075 <> U+0294; k1Bu ʔ
U+006B U+0035 U+0031 U+0075 <> U+0278; k51u ɸ
U+006B U+0035 U+0032 U+0075 <> U+0066; k52u f
U+006B U+0035 U+0033 U+0075 <> U+03B8; k53u θ
U+006B U+0035 U+0034 U+0075 <> U+0073; k54u s
U+006B U+0035 U+0035 U+0075 <> U+0283; k55u ʃ
U+006B U+0035 U+0036 U+0075 <> U+0282; k56u ʂ
U+006B U+0035 U+0037 U+0075 <> U+00E7; k57u ç
U+006B U+0035 U+0038 U+0075 <> U+0078; k58u x
U+006B U+0035 U+0039 U+0075 <> U+03C7; k59u χ
U+006B U+0035 U+0041 U+0075 <> U+0127; k5Au ħ
U+006B U+0035 U+0042 U+0075 <> U+0068; k5Bu h
U+006B U+0036 U+0034 U+0075 <> U+026C; k64u ɬ
MWE code
\documentclass[12pt]{article}
\usepackage{xcolor}
\usepackage{fontspec}
\setmainfont{Noto Serif}
\newcommand\ipafontname{DejaVu Serif}
\newfontface\ipac[Mapping=ipacoord-to-ipa,Scale=1.1,Colour=red]{\ipafontname}
\begin{document}
Using IPA font = \ipafontname .
\medskip
Vowels
\noindent
v11u {\ipac v11u}
v11r {\ipac v11r}
v12u {\ipac v12u}
v12r {\ipac v12r}
v13u {\ipac v13u}
v13r {\ipac v13r} \\
v21u {\ipac v21u}
v21r {\ipac v21r}
v23r {\ipac v23r} \\
v31u {\ipac v31u}
v31r {\ipac v31r}
v32u {\ipac v32u}
v32r {\ipac v32r}
v33u {\ipac v33u}
v33r {\ipac v33r} \\
v42r {\ipac v42r} \\
v51u {\ipac v51u}
v51r {\ipac v51r}
v52u {\ipac v52u}
v52r {\ipac v52r}
v53u {\ipac v53u}
v53r {\ipac v53r} \\
v61r {\ipac v61r}
v62r {\ipac v62r} \\
v71u {\ipac v71u}
v71r {\ipac v71r}
v73u {\ipac v73u}
v73r {\ipac v73r}
\medskip
Consonants -- voiced
\noindent
k11 {\ipac k11}
k14 {\ipac k14}
k16 {\ipac k16}
k17 {\ipac k17}
k18 {\ipac k18}
k19 {\ipac k19} \\
k21 {\ipac k21}
k22 {\ipac k22}
k24 {\ipac k24}
k26 {\ipac k26}
k27 {\ipac k27}
k28 {\ipac k28}
k29 {\ipac k29} \\
k31 {\ipac k31}
k34 {\ipac k34}
k39 {\ipac k39} \\
k42 {\ipac k42}
k44 {\ipac k44}
k46 {\ipac k46} \\
k51 {\ipac k51}
k52 {\ipac k52}
k53 {\ipac k53}
k54 {\ipac k54}
k55 {\ipac k55}
k56 {\ipac k56}
k57 {\ipac k57}
k58 {\ipac k58}
k59 {\ipac k59}
k5A {\ipac k5A}
k5B {\ipac k5B} \\
k64 {\ipac k64} \\
k72 {\ipac k72}
k74 {\ipac k74}
k76 {\ipac k76}
k77 {\ipac k77}
k78 {\ipac k78} \\
k84 {\ipac k84}
k86 {\ipac k86}
k87 {\ipac k87}
k88 {\ipac k88}
\medskip
Consonants -- unvoiced
\noindent
k11u {\ipac k11u}
k14u {\ipac k14u}
k16u {\ipac k16u}
k17u {\ipac k17u}
k18u {\ipac k18u}
k19u {\ipac k19u}
k1Bu {\ipac k1Bu} \\
k51u {\ipac k51u}
k52u {\ipac k52u}
k53u {\ipac k53u}
k54u {\ipac k54u}
k55u {\ipac k55u}
k56u {\ipac k56u}
k57u {\ipac k57u}
k58u {\ipac k58u}
k59u {\ipac k59u}
k5Au~{\ipac k5Au}
k5Bu~{\ipac k5Bu} \\
k64u {\ipac k64u}
\end{document}
Setting the IPA font to an italic one does the expected:

I haven't thought of a way (yet) to compress the alias string to one, two or three characters, so as to save typing, but some of the more frequent usages logically could be 'shrunk', at the expense of squeezing out information.
escape
option on Alan’s second link looks useful. – Daniel Harbour Jan 7 '13 at 8:56