Generates a bout of one or more syllables with pauses between them. Two basic components are synthesized: the harmonic component (the sum of sine waves with frequencies that are multiples of the fundamental frequency) and the noise component. Both components can be filtered with independently specified formants. Intonation and amplitude contours can be applied both within each syllable and across multiple syllables. Suggested application: synthesis of animal or human non-linguistic vocalizations. For more information, see http://cogsci.se/soundgen.html and vignette('sound_generation', package = 'soundgen').
soundgen(
repeatBout = 1,
nSyl = 1,
sylLen = 300,
pauseLen = 200,
pitch = list(time = c(0, 0.1, 0.9, 1), value = c(100, 150, 135, 100)),
pitchGlobal = NA,
glottis = 0,
temperature = 0.025,
tempEffects = list(),
maleFemale = 0,
creakyBreathy = 0,
nonlinBalance = 100,
nonlinRandomWalk = NULL,
subRatio = 2,
subFreq = 0,
subDep = 0,
subWidth = 10000,
shortestEpoch = 300,
jitterLen = 1,
jitterDep = 0,
vibratoFreq = 5,
vibratoDep = 0,
shimmerDep = 0,
shimmerLen = 1,
attackLen = 50,
rolloff = -9,
rolloffOct = 0,
rolloffKHz = -3,
rolloffParab = 0,
rolloffParabHarm = 3,
rolloffExact = NULL,
lipRad = 6,
noseRad = 4,
mouthOpenThres = 0,
formants = c(860, 1430, 2900),
formantDep = 1,
formantDepStoch = 20,
formantWidth = 1,
formantCeiling = 2,
formantLocking = 0,
vocalTract = NA,
amDep = 0,
amFreq = 30,
amShape = 0,
noise = NULL,
formantsNoise = NA,
rolloffNoise = -4,
noiseFlatSpec = 1200,
rolloffNoiseExp = 0,
noiseAmpRef = c("f0", "source", "filtered")[3],
mouth = list(time = c(0, 1), value = c(0.5, 0.5)),
ampl = NA,
amplGlobal = NA,
interpol = c("approx", "spline", "loess")[3],
discontThres = 0.05,
jumpThres = 0.01,
samplingRate = 16000,
windowLength = 50,
overlap = 75,
addSilence = 100,
pitchFloor = 1,
pitchCeiling = 3500,
pitchSamplingRate = 16000,
dynamicRange = 80,
invalidArgAction = c("adjust", "abort", "ignore")[1],
plot = FALSE,
play = FALSE,
savePath = NA,
...
)
number of times the whole bout should be repeated
number of syllables in the bout. `pitchGlobal`, `amplGlobal`, and `formants` span multiple syllables, but not multiple bouts
average duration of each syllable, ms (vectorized)
average duration of pauses between syllables, ms (can be negative between bouts: force with invalidArgAction = 'ignore') (vectorized)
a numeric vector of f0 values in Hz or a dataframe specifying the time (ms or 0 to 1) and value (Hz) of each anchor, hereafter "anchor format". These anchors are used to create a smooth contour of fundamental frequency f0 (pitch) within one syllable
unlike pitch
, these anchors are
used to create a smooth contour of average f0 across multiple syllables.
The values are in semitones relative to the existing pitch, i.e. 0 = no
change (anchor format)
anchors for specifying the proportion of a glottal cycle with closed glottis, % (0 = no modification, 100 = closed phase as long as open phase); numeric vector or dataframe specifying time and value (anchor format)
hyperparameter for regulating the amount of stochasticity in sound generation
a list of scaling coefficients regulating the effect of
temperature on particular parameters. To change, specify just those pars
that you want to modify (default is 1 for all of them). sylLenDep
:
duration of syllables and pauses; formDrift
: formant frequencies;
formDisp
: dispersion of stochastic formants; pitchDriftDep
:
amount of slow random drift of f0; pitchDriftFreq
: frequency of slow
random drift of f0; amplDriftDep
: drift of amplitude mirroring pitch
drift; subDriftDep
: drift of subharmonic frequency and bandwidth
mirroring pitch drift; rolloffDriftDep
: drift of rolloff mirroring
pitch drift; pitchDep, noiseDep, amplDep
:
random fluctuations of user-specified pitch / noise / amplitude anchors;
glottisDep
: proportion of glottal cycle with closed glottis;
specDep
: rolloff, rolloffNoise, nonlinear effects, attack
hyperparameter for shifting f0 contour, formants, and vocalTract to make the speaker appear more male (-1...0) or more female (0...+1); 0 = no change
hyperparameter for a rough adjustment of voice quality from creaky (-1) to breathy (+1); 0 = no change
hyperparameter for regulating the (approximate) proportion of sound with different regimes of pitch effects (none / subharmonics only / subharmonics and jitter). 0% = no noise; 100% = the entire sound has jitter + subharmonics. Ignored if temperature = 0
a numeric vector specifying the timing of nonliner regimes: 0 = none, 1 = subharmonics, 2 = subharmonics + jitter + shimmer
a positive integer giving the ratio of f0 (the main fundamental) to g0 (a lower frequency): 1 = no subharmonics, 2 = period doubling regardless of pitch changes, 3 = period tripling, etc; subRatio overrides subFreq (anchor format)
instead of a specific number of subharmonics (subRatio), we can specify the approximate g0 frequency (Hz), which is used only if subRatio = 1 and is adjusted to f0 so f0/g0 is always an integer (anchor format)
the depth of subharmonics relative to the main frequency component (f0), %. 0: no subharmonics; 100: g0 harmonics are as strong as the nearest f0 harmonic (anchor format)
Width of subharmonic sidebands - regulates how rapidly g-harmonics weaken away from f-harmonics: large values like the default 10000 means that all g0 harmonics are equally strong (anchor format)
minimum duration of each epoch with unchanging subharmonics regime or formant locking, in ms
duration of stable periods between pitch jumps, ms. Use a low value for harsh noise, a high value for irregular vibrato or shaky voice (anchor format)
cycle-to-cycle random pitch variation, semitones (anchor format)
the rate of regular pitch modulation, or vibrato, Hz (anchor format)
the depth of vibrato, semitones (anchor format)
random variation in amplitude between individual glottal cycles (0 to 100% of original amplitude of each cycle) (anchor format)
duration of stable periods between amplitude jumps, ms. Use a low value for harsh noise, a high value for shaky voice (anchor format)
duration of fade-in / fade-out at each end of syllables and noise (ms): a vector of length 1 (symmetric) or 2 (separately for fade-in and fade-out)
basic rolloff from lower to upper harmonics, db/octave
(exponential decay). All rolloff parameters are in anchor format. See
getRolloff
for more details
basic rolloff changes from lower to upper harmonics
(regardless of f0) by rolloffOct
dB/oct. For example, we can get
steeper rolloff in the upper part of the spectrum
rolloff changes linearly with f0 by rolloffKHz
dB/kHz. For ex., -6 dB/kHz gives a 6 dB steeper basic rolloff as f0 goes up
by 1000 Hz
an optional quadratic term affecting only the first
rolloffParabHarm
harmonics. The middle harmonic of the first
rolloffParabHarm
harmonics is amplified or dampened by
rolloffParab
dB relative to the basic exponential decay
the number of harmonics affected by
rolloffParab
user-specified exact strength of harmonics: a vector or matrix with one row per harmonic, scale 0 to 1 (overrides all other rolloff parameters)
the effect of lip radiation on source spectrum, dB/oct (the default of +6 dB/oct produces a high-frequency boost when the mouth is open)
the effect of radiation through the nose on source spectrum,
dB/oct (the alternative to lipRad
when the mouth is closed)
open the lips (switch from nose radiation to lip
radiation) when the mouth is open >mouthOpenThres
, 0 to 1
either a character string like "aaui" referring to default
presets for speaker "M1" or a list of formant times, frequencies,
amplitudes, and bandwidths (see ex. below). formants = NA
defaults
to schwa. Time stamps for formants and mouthOpening can be specified in ms
or an any other arbitrary scale. See getSpectralEnvelope
for
more details
scale factor of formant amplitude (1 = no change relative
to amplitudes in formants
)
the amplitude of additional stochastic formants added above the highest specified formant, dB (only if temperature > 0)
scale factor of formant bandwidth (1 = no change)
frequency to which stochastic formants are calculated, in multiples of the Nyquist frequency; increase up to ~10 for long vocal tracts to avoid losing energy in the upper part of the spectrum
the approximate proportion of sound in which one of the harmonics is locked to the nearest formant, 0 = none, 1 = the entire sound (anchor format)
the length of vocal tract, cm. Used for calculating formant
dispersion (for adding extra formants) and formant transitions as the mouth
opens and closes. If NULL
or NA
, the length is estimated
based on specified formant frequencies, if any (anchor format)
amplitude modulation depth, %. 0: no change; 100: amplitude modulation with amplitude range equal to the dynamic range of the sound (anchor format)
amplitude modulation frequency, Hz (anchor format)
amplitude modulation shape (-1 to +1, defaults to 0) (anchor format)
loudness of turbulent noise (0 dB = as loud as voiced component, negative values = quieter) such as aspiration, hissing, etc (anchor format)
the same as formants
, but for unvoiced instead of
voiced component. If NA (default), the unvoiced component will be filtered
through the same formants as the voiced component, approximating aspiration
noise [h]
linear rolloff of the excitation source for
the unvoiced component, rolloffNoise
dB/kHz (anchor format) applied
above noiseFlatSpec
Hz
exponential rolloff of the excitation source for the unvoiced component, dB/oct (anchor format) applied above 0 Hz
noise amplitude is defined relative to: "f0" = the amplitude of the first partial (fundamental frequency), "source" = the amplitude of the harmonic component prior to applying formants, "filtered" = the amplitude of the harmonic component after applying formants
mouth opening (0 to 1, 0.5 = neutral, i.e. no modification) (anchor format)
amplitude envelope (dB, 0 = max amplitude) (anchor format)
global amplitude envelope spanning multiple syllables (dB, 0 = no change) (anchor format)
the method of smoothing envelopes based on provided anchors: 'approx' = linear interpolation, 'spline' = cubic spline, 'loess' (default) = polynomial local smoothing function. NB: this does not affect contours for "noise", "glottal", and the smoothing of formants
if two anchors are closer in time than
discontThres
, the contour is broken into segments with a linear
transition between these anchors; if anchors are closer than
jumpThres
, a new section starts with no transition at all (e.g. for
adding pitch jumps)
sampling frequency, Hz
length of FFT window, ms
FFT window overlap, %. For allowed values, see
istft
silence before and after the bout, ms
lower & upper bounds of f0
sampling frequency of the pitch contour only, Hz.
Low values reduce processing time. Set to pitchCeiling
for optimal
speed or to samplingRate
for optimal quality
dynamic range, dB. Harmonics and noise more than dynamicRange under maximum amplitude are discarded to save computational resources
what to do if an argument is invalid or outside the
range in permittedValues
: 'adjust' = reset to default value, 'abort'
= stop execution, 'ignore' = throw a warning and continue (may crash)
if TRUE, plots a spectrogram
full path for saving the output, e.g. '~/Downloads/temp.wav'. If NA (default), doesn't save anything
other plotting parameters passed to spectrogram
Returns the synthesized waveform as a numeric vector.
# NOT RUN {
# NB: GUI for soundgen is available as a Shiny app.
# Type "soundgen_app()" to open it in default browser
# Set "playback" to TRUE for default system player or the name of preferred
# player (eg "aplay") to play back the audio from examples
playback = c(TRUE, FALSE, 'aplay', 'vlc')[2]
sound = soundgen(play = playback)
# spectrogram(sound, 16000, osc = TRUE)
# playme(sound)
# Control of intonation, amplitude envelope, formants
s0 = soundgen(
pitch = c(300, 390, 250),
ampl = data.frame(time = c(0, 50, 300), value = c(-5, -10, 0)),
attack = c(10, 50),
formants = c(600, 900, 2200),
play = playback
)
# Use the in-built collection of presets:
# names(presets) # speakers
# names(presets$Chimpanzee) # calls per speaker
s1 = eval(parse(text = presets$Chimpanzee$Scream_conflict)) # screaming chimp
# playme(s1)
s2 = eval(parse(text = presets$F1$Scream)) # screaming woman
# playme(s2)
# }
# NOT RUN {
# unless temperature is 0, the sound is different every time
for (i in 1:3) sound = soundgen(play = playback, temperature = .2)
# Bouts versus syllables. Compare:
sound = soundgen(formants = 'uai', repeatBout = 3, play = playback)
sound = soundgen(formants = 'uai', nSyl = 3, play = playback)
# Intonation contours per syllable and globally:
sound = soundgen(nSyl = 5, sylLen = 200, pauseLen = 140,
play = playback, pitch = data.frame(
time = c(0, 0.65, 1), value = c(977, 1540, 826)),
pitchGlobal = data.frame(time = c(0, .5, 1), value = c(-6, 7, 0)))
# Subharmonics in sidebands (noisy scream)
sound = soundgen (subFreq = 75, subDep = runif(10, 0, 60), subWidth = 130,
pitch = data.frame(
time = c(0, .3, .9, 1), value = c(1200, 1547, 1487, 1154)),
sylLen = 800,
play = playback, plot = TRUE)
# Jitter and mouth opening (bark, dog-like)
sound = soundgen(repeatBout = 2, sylLen = 160, pauseLen = 100,
subFreq = 100, subDep = 100, subWidth = 60, jitterDep = 1,
pitch = c(559, 785, 557),
mouth = c(0, 0.5, 0),
vocalTract = 5, formants = NULL,
play = playback, plot = TRUE)
# See the vignette on sound generation for more examples and in-depth
# explanation of the arguments to soundgen()
# Examples of code for creating human and animal vocalizations are available
# on project's homepage: http://cogsci.se/soundgen.html
# }
Run the code above in your browser using DataLab