Can we talk about talkies (pun intended)!

Hi everyone,

Few days ago, I created a config that was just a smidge above flash memory, having already disabled in Arduino “WebUSB” & “MassStorage”, all that I had left was to use #define DISABLE_TALKIE (I am aware of the ProffieOS Documentation: Saving FLASH Memory page, I believe I have done all that already)

I could have disabled in Arduine Serial and use “No USB” instead but I was worried it would affect serial monitor access and/or future config upload “easyness” (I prefer not to have to push boot & reset if I don’t have to). I wanted serial monitor so I didn’t try it.

I was a bit shocked/baffled that my config went from “a smidge above max” (a few 100 bytes) to 96% of flash memory used on a Proffie v2.2, that’s at least another preset. :wink: And I always say “The more preset, the more better!” :rofl:

Of course, I had to have a typo in one of my font folder names :roll_eyes:, and for the life of me, I was unable to decode the beep error (thank you serial monitor for the text error message) without the talkies (I couldn’t tell if it was “error_in_font_directory” or “font_directory_not_found”, because I do not have “musical” ears). So obviously I would like to keep some talkies but not all of them!

I was wondering, what would it take to reduce the memory that talkies need ? After a quick Github Master search, I found where all the Talkies were used/hidden:

I am personally only interested to keep:

  1. sd_card_not_found
  2. font_directory_not_found
  3. error_in_font_directory

But I would like to shorten them like this (with matching audio):

  1. no_sd
  2. no_font
  3. font_error

I have already replaced all the “battery level talkies” in my props with sound_library_.SayBatteryPercent(), sound_library_.SayBatteryVolts() or my personal favorite sound_library_.SayBatteryPercentVolts() (a personal addition in my OS, because why choose or having to remember pointing up or down when you can have both pointing anywhere? :grin:). I find it a lot clearer than the male or female talkie voice and it is customizable with all the available voicepacks (thanks to @NoSloppy).

For the “low_battery” error, that shouldn’t be a problem since I have a lowbatt.wav in my common. Right ?

For the “error_in_blade_array”, is that something that can still happen with Proffie OS7.15/8.x ? Wouldn’t this cause a compile error before ever being loaded on a Proffieboard ?

Part of the code for “error_in_preset_array” can still be found in ../sound/voice_data.h (line 686) where I also found a lot of words that are not relevant to lightsabers (but they are relevant in aviation :grinning:). Would commenting those words out reduce the size of Talkies ? I’ll go through them one by one.

I was thinking to guard everything else than errors 1,2 & 3 above behind an #ifndef KEEP_MINIMUM_TALKIES_ONLY

And then there is ../sound/talkies.h? What could be “trimmed” or hidden behind #ifndef KEEP_MINIMUM_TALKIES_ONLY?
What are those #define TI_0280_PATENT_ENERGY, #define TI_028X_LATER_ENERGY, #define TI_0280_2801_PATENT_PITCH, … tables for ?

I am willing to do the work even if it might be long, slow and frustrating. I would love to reduce talkies from 3-4% down to around 1%, if possible ?

Anybody else interested in my potential findings? Or has this been attempted and this is already the best we can get?

I assume you are aware of this page?

Second, if you don’t understand the beeps, why not just plug it in and check what it says in the serial monitor?

Yes I am. The only tune I can 100% recognize every time is the deprecated “aliens_are_here”
Edit: not that I ever heard it coming from my saber!

I literally said that’s what I did!

But that is the whole point, I would like to not have to plug in to the serial monitor to understand those 3 errors and get rid of all the other talkies that are irrelevant to me so that I can reduce the size of flash memory that my talkies need.

I don’t understand what the point of avoiding the serial monitor is, but let me see if I can answer your actual questions.

You will need to record and LPC encode new sounds probably.

Right.

It can still happen. Most common error is an invalid subblade()

Words and phrases that are not used do not take up any flash memory.

Again, anything that isn’t used doesn’t take any space.

Unfortunately, I don’t think that’s possible. Reducing and shortening the number of sounds will help, some of that space is the code itself, which takes up the same amount of space whether you use use one sound or a million sounds.

They decide how much energy to add to different frequencies in the LPC algorithm. They cannot easily be removed or shrunk.

I think most people just turn off the spoken errors and call it a day.

Less plug/unplug the cable in the Proffieboard for longer life of both the cable and the USB port on the board, less mechanical wear and tear and less chance of ripping the USB port of the board. I use the serial monitor when needed but for a miss-named folder/missing file on the SD-Card, I would rather avoid it when I can.

Thank you, that helped a lot.

I think, I am on the right track:

DISABLE_TALKIE:
Sketch uses 245016 bytes (93%) of program storage space. Maximum is 262144 bytes.

Full Talkies:
Sketch uses 255312 bytes (97%) of program storage space. Maximum is 262144 bytes.

KEEP_MINIMUM_TALKIE_ONLY:
Sketch uses 249440 bytes (95%) of program storage space. Maximum is 262144 bytes.

I made changes to:

  • common/errors.h
  • sound/talkie.h
  • sound/voice_data.h where I put all the sounds I didn’t need between an #ifndef KEEP_MINIMUM_TALKIE_ONLY #else which led me to all the other places where talkie was still called:
    • sound/sound.h
    • common/battery_monitor.h
    • props/prop_base.h
    • styles/length_finder.h
    • I believe that’s it, at least for the defines in my current config. Many of those talkie could be replaced with something from sound_library_.Sayxxx() especially all the calls to talkie.SayDigit, talkie.SayNumber which seems to use the bulk of the memory I saved.

I was thinking of isolating the words or letters from the talkies that already exists like for example from const unsigned char talkie_error_in_15[] = { ... code here ... } to const unsigned char talkie_error_15[] = { ... same-ish code but shorter ... }, could that possibly work ?

That talkie can be replaced with:

// play the fonts error in blade array sound if it exists
if (SFX_erbladar) {  // with EFFECT(erbladar); added in sound/effect.h
  hybrid_font.PlayCommon(&SFX_erbladar);
  return;
}

I did save 2.2% already out of the 3.9% that talkie needs, I don’t think that negligible, or is it ?

Plus I am guessing that not all of them are being used, so they don’t take memory in the first place. Correct?

BUt you have to plug it in to program it.
Maybe just check each preset before unplugging?

Right, the “batt” command can go imho if that saves memory.
The calls in LengthFinder are a little tricker, but they don’t take any memory unless you are actually using the LengthFinder style, so that’s probably fine.

I think that’s going to be difficult, because the data is bit-packed. You would need to decode the data into “frames” (See talkie::ReadFrame) then you can discard the frames you don’t want and re-encode the remaining data.

Maybe, but if you have an error in your blade array, the presets might also be non-functional.

That’s a good chunk. Maybe it is possible to get it down to 1%, I don’t actually know. It’s hard to get excited about it, because the beep errors and the serial monitor are enough for me.

Correct

True, but when a chassis has no buttons and/or if the board can’t be plugged in via USB while using the hilt buttons , how is one supposed to do that? I guess by learning all the serial monitor commands, it’s most likely possible - but a lot less fun, depending who you’re asking.

I am pretty sure that an average user who wants to have as many presets as possible (we are many) would rather have an absolute minimum amount of talkies for “just in case” and have DISABLE_DIAGNOSTIC_COMMANDS defined for less amount of space than having the “DIAGNOSTIC_COMMANDS” available and no talkie. Am I wrong in thinking this ?

Oh, that’s gone already (in “my OS” with KEEP_MINIMUM_TALKIE_ONLY)

Well, I didn’t use the LengthFinder style in this config, yet something in the talkie.SayNumber(led_ + 1); line was still creating a “was not declared in this scope” error! I have guarded SayNumber in talkies.h inside of my #ifndef KEEP_MINIMUM_TALKIE_ONLY

Sure, it might be non-functional, but I kept the beeper.
In fact this last remark got me thinking for most of the day before posting my answer.
Here is what crept in my mind, please read till the end:

  • in OS8.x there is #define FONT_PATTERN witch if not defined will default to "*;common"
  • in OS7.x & possibly OS6.x (I never used OS6.x so I can’t be 100% sure) where Edit Mode was introduced in saber_fett263_buttons.h and requiring a voicepack to be present in common folder for Fetts263’s prop to work. I don’t know if this is still the case with OS8.x (requiring a common folder)?
  • I read countless times on The Crucible from the older/oldest threads about the “dreaded” “error in font directory” usually due to a missing common folder or an empty common folder.

Based on this, I believe it is “fair to assume” that:

  • experienced ProffieOS users with OS6.x or above would most probably already have a common folder and if they don’t have one yet, they should.
  • inexperienced ProffieOS users would most probably not immediately use #define DISABLE_TALKIE until they run into the “over Flash memory wall”

This is where I am trying to get to:
Except for “sd_card_not_found”, every other error could/should be found as a “*.wav” in your common and/or in your #define FONT_PATTERN "*;what_ever_folder_is_declared_here"
“sd_card_not_found” could still have a talkie if desired, beepers would still be used “if (SFX_error_name) not found”

I realized. I asked AI to make me some talkie. It only gave me noises as usual! Then I decided to change tactic: I found in voice_prompt.h:

  • spNO, spS, spD. That sounds way better than the “sd_card” “not_found” talkie IMHO. I love the military voice!
  • spERROR & spERROR2 but I am having a hard time to decide which sounds better.
  • all I need now is a good “military voice” for “font” talkie

Is this something to Google ? I tried to Google it but didn’t seem to give anything useful.

I used to get excited about my next flight, next new destination, next new country to fly over. Now I only get excited with some “in flight aircraft malfunction”, with limited fuel to land while a major storm is approaching!
As far as ProffieOS goes, I get excited to get out of bed because I might have dreamed of a way to save 100 bytes. So saving 2 to 4 Kbytes or more in one go while keeping what I want-to/can-still hear properly, gets me very excited, unlike the beepers that my 51 years old and 16000 hours+ spent in a noisy cockpit can barely hear anymore, and I can forget differentiating/recognizing them! But of course, to each their own excitements!

I would at least use the “n” command to walk through the presets before disconnecting.

I have no idea, I’m not an “average” user. Most of the time I find that it’s better to put effort into features that I need/like/want, because I don’t have to guess what that is.

Commenting out a function will create an error when some code calls that function. However, if “some code” is not actually called anywhere, then it still doesn’t take any memory.

In general, commenting out a bunch of code in talkie is a good way to find out where it is called from, but that is not what the final implementation should look like. The final implementation should change where those functions are used, not the functions themselves.

I think this idea has potential, but it’s a little over-simplified. For one thing, a lot of the props don’t require a voice pack. Second, there are number of reasons why a voice pack might not be found, and having different errors for those would be helpful. Maybe we should have a “voice pack not fund” error?

Good luck, I have not found one.

No, it is a ProffieOS function:

Saving memory can be a lot of fun.
I had fun making those beep codes (incidentally, it turns out that I was 51 when I made them). I really don’t mind you doing this, and I’m open to having a define for a minmum talkie sort of thing, however I think you should be doing it for you, not for “the average user”. I really don’t know, but I think there are really two kinds of users:

  1. people who just want it to work
  2. people who wants to have the most presets humanly possible

User (1) will want the best error messages, user (2) will want no error messages. I think users who want some balance between them might be rare. (but I could be wrong)

Now the real trick would be to make the error messages better AND save some memory. If we could manage that I would just make that the default, no define(s) needed.

1 Like

Nice one. I knew this existed but I never realized how practical this “n” could be.
As @Sabersense would say: “Another tool for the toolbox.”

I definitely like and want this feature (at least on my OS version), I probably don’t absolutely need it but I find it fun.

I think I understand what you mean even if I don’t visualize how to do it. I started adding my changes to a branch of my Github fork. I’ll share the link once I am happy with it. And maybe you can take a look if you like?

What I meant to say is that all errors (except sd card not found) could potentially be found on the sd-card as “*.wav”. The OS would just need to “be told” where to look. I think a “voice pack not found” error is a great idea.

I am doing it for me but it motivates me even more if I believe others might like/want it too.

I want minimal errors messages that are clear to my ears with maximum presets. :grinning:
Obviously what is clear to my ears may be less clear to someone else.

Cool, I’ll give it my best shot.

Agree. Using “Error in font directory” currently lacks specificity.
Additionally, maybe an “Error in voice pack version” one is a good idea.

I made “voice pack” and “version” so we can string together the phrases.
I don’t have a board with me at the moment so if someone wants to see how this sounds that would be cool.

const unsigned char talkie_voice_pack_15[] = {0x80,0x12,0xe5,0xdb,0xc2,0x23,0x16,0x89,0x75,0xc8,0xf4,0x74,0x3b,0x22,0x76,0x36,0xca,0xcd,0xac,0xaa,0xd0,0xf4,0x2c,0xf6,0x68,0x6a,0x02,0xb5,0x32,0xa9,0xaa,0xb2,0xf3,0xf5,0xc8,0x16,0xcf,0xd2,0xc1,0x33,0x39,0xd6,0x24,0x8b,0x14,0x2f,0x39,0x5a,0xef,0x94,0x52,0xbc,0xec,0x28,0xab,0xd3,0x8e,0xf3,0xb2,0xe3,0x88,0x0c,0x7b,0xc6,0x2f,0x8e,0x23,0x22,0xe2,0xb9,0xb1,0x38,0xb3,0xac,0x88,0x1c,0xe6,0x92,0x25,0xa3,0x32,0x4a,0x58,0x6a,0x94,0xb2,0x8e,0xb8,0xca,0x2f,0x4e,0x2d,0x32,0xeb,0x94,0xb0,0x2a,0x71,0xaf,0x88,0xd2,0x82,0x10,0xaa,0x42,0x35,0x4e,0xf1,0x42,0xd2,0xf1,0x55,0x3a,0xc5,0x8b,0xd9,0xc6,0x4f,0xe8,0x26,0x3f,0xb4,0x58,0x1b,0x91,0x97,0xfc,0xd0,0x62,0xad,0xc5,0x6e,0xf2,0x63,0xb2,0xb5,0x65,0xbb,0xc5,0xcf,0x81,0xd7,0x5e,0x2d,0x87,0xa0,0x26,0x2a,0x39,0xb7,0xed,0x82,0x52,0xb8,0xa2,0xdb,0xaa,0x99,0x73,0x92,0xaa,0xca,0xa8,0x69,0x2d,0x99,0x33,0x2b,0xa3,0x96,0xb5,0x46,0x29,0xeb,0x8c,0x6a,0x82,0x1a,0x38,0x3d,0x33,0x0e};

const unsigned char talkie_version_15[] = {0x26,0xb5,0xc6,0x23,0x43,0x2c,0x87,0xd4,0x06,0xef,0x08,0xb3,0x9d,0x12,0x35,0x6c,0xdc,0xd5,0x4e,0x4a,0xf4,0xd0,0x49,0xb3,0xd8,0x29,0xd1,0x5d,0xbb,0x5c,0x1c,0xa7,0x44,0x57,0xdd,0x74,0x8b,0x5c,0x12,0x93,0x75,0xc6,0xdd,0x56,0x49,0x43,0xa0,0xe9,0xf4,0xc8,0x25,0x2d,0x8e,0x2d,0x2a,0x1a,0x97,0xac,0x5b,0x53,0x4e,0x6f,0x92,0xd2,0xe1,0x44,0x34,0xac,0x75,0x49,0x92,0xf2,0x8a,0xf2,0x50,0x29,0x8d,0xda,0x3b,0xd3,0x0c,0x85,0x34,0xca,0xc8,0x08,0x35,0x1d,0xb2,0x20,0x32,0xd3,0xcc,0x4c,0xc8,0xbc,0xb6,0x72,0x0b,0xcb,0x21,0x0b,0x46,0x42,0x32,0x6d,0xbb,0x2c,0x4a,0x4d,0xce,0x90,0xa5,0xf2,0xa4,0x34,0x54,0xd3,0xb6,0xc8,0xb3,0x70,0x0b,0x73,0xcb,0x22,0xcd,0xd2,0xcd,0x5d,0x6d,0x8b,0x34,0x2b,0xb7,0x70,0xb3,0xcd,0x8e,0x22,0xdd,0x23,0x2c,0x0e,0x00};
2 Likes

FYI you can just play these via serial monitor commads, no upload required. Like send this to play “voice pack”

talkie15 0x80,0x12,0xe5,0xdb,0xc2,0x23,0x16,0x89,0x75,0xc8,0xf4,0x74,0x3b,0x22,0x76,0x36,0xca,0xcd,0xac,0xaa,0xd0,0xf4,0x2c,0xf6,0x68,0x6a,0x02,0xb5,0x32,0xa9,0xaa,0xb2,0xf3,0xf5,0xc8,0x16,0xcf,0xd2,0xc1,0x33,0x39,0xd6,0x24,0x8b,0x14,0x2f,0x39,0x5a,0xef,0x94,0x52,0xbc,0xec,0x28,0xab,0xd3,0x8e,0xf3,0xb2,0xe3,0x88,0x0c,0x7b,0xc6,0x2f,0x8e,0x23,0x22,0xe2,0xb9,0xb1,0x38,0xb3,0xac,0x88,0x1c,0xe6,0x92,0x25,0xa3,0x32,0x4a,0x58,0x6a,0x94,0xb2,0x8e,0xb8,0xca,0x2f,0x4e,0x2d,0x32,0xeb,0x94,0xb0,0x2a,0x71,0xaf,0x88,0xd2,0x82,0x10,0xaa,0x42,0x35,0x4e,0xf1,0x42,0xd2,0xf1,0x55,0x3a,0xc5,0x8b,0xd9,0xc6,0x4f,0xe8,0x26,0x3f,0xb4,0x58,0x1b,0x91,0x97,0xfc,0xd0,0x62,0xad,0xc5,0x6e,0xf2,0x63,0xb2,0xb5,0x65,0xbb,0xc5,0xcf,0x81,0xd7,0x5e,0x2d,0x87,0xa0,0x26,0x2a,0x39,0xb7,0xed,0x82,0x52,0xb8,0xa2,0xdb,0xaa,0x99,0x73,0x92,0xaa,0xca,0xa8,0x69,0x2d,0x99,0x33,0x2b,0xa3,0x96,0xb5,0x46,0x29,0xeb,0x8c,0x6a,0x82,0x1a,0x38,0x3d,0x33,0x0e

I tried them. They sound very garbled. I added them in voice_data.h
and added:

      if (!strcmp(arg, "bcvpv")) {
        Say(talkie_voice_pack_15, 15);
        Say(talkie_version_15, 15);
        return true;
      }

in the ENABLE_DEVELOPER_COMMANDS section of talkie.h

It plays a series of sounds from someone trying to talk under water for approximately 10 seconds. A series of “glub, glub, glub”
But the tone of the voice seems to be the same as the other talkie_something_15

Edit2: recording deleted

It’s been a while. I think I needed to include an explicit stop frame.
See if this is better for “version”

0x24,0x2d,0x44,0xc5,0x3d,0x6a,0x99,0x24,0x49,0xf3,0x74,0x8b,0x93,0x62,0x9f,0x64,0x5a,0x2d,0x76,0x8a,0x7d,0x96,0x4b,0x33,0x2b,0x29,0x0e,0x89,0x2f,0x52,0x22,0xa7,0x38,0x06,0xbc,0xf0,0xb4,0x5c,0xe2,0x18,0xf0,0x32,0x23,0x52,0x89,0x43,0xa0,0xad,0x0e,0x5b,0x25,0xc9,0x01,0xab,0xba,0x66,0x95,0xb4,0x3b,0x33,0x31,0x6b,0x13,0x80,0xa5,0xd5,0x03,0xb0,0x9c,0xaa,0x03,0xa6,0x36,0x2f,0x71,0x74,0x56,0xd9,0x69,0xb8,0x24,0xc1,0x47,0x55,0x25,0x95,0x92,0x06,0x1f,0xd5,0xe5,0xa6,0x53,0xea,0x62,0x65,0xa5,0x49,0x31,0x59,0x50,0x9e,0xe9,0x26,0xca,0x64,0x41,0x69,0x86,0xa7,0x65,0x93,0x05,0x6d,0x65,0x11,0xa2,0x55,0x16,0x8c,0xb6,0x47,0x88,0x42,0x69,0x52,0x9a,0x16,0x29,0x0b,0xe0,0x01

and this for “voice pack”

0x24,0x0a,0xc2,0xd9,0x22,0xe3,0xa9,0xc8,0xba,0xcc,0x50,0xb3,0x63,0x22,0xf5,0x5c,0xb5,0xaa,0x8e,0x0b,0xd5,0x33,0xb5,0xc9,0xda,0x2e,0x90,0x2f,0x4c,0x73,0x23,0x27,0x5f,0xad,0x6c,0x8e,0xb6,0x94,0x7c,0x97,0x74,0xb5,0x43,0x4e,0xf1,0x83,0x97,0xee,0x4a,0x29,0x21,0x88,0x56,0x63,0x32,0xed,0xb9,0x28,0x7b,0xf3,0xb4,0x48,0x66,0x82,0x62,0x42,0xbc,0xbc,0x8e,0x0a,0x8a,0x4c,0xcd,0xca,0x2a,0x22,0xa8,0xba,0x28,0x3b,0xea,0x89,0xa8,0xd9,0x10,0xf3,0xac,0x12,0x82,0x90,0x74,0xa2,0x4c,0x72,0x09,0x62,0xd1,0xf5,0x31,0xc5,0x25,0x0c,0xcd,0xd6,0x5a,0xd9,0x96,0x28,0x16,0x5b,0x1b,0x51,0x52,0xa2,0x94,0x64,0xed,0xd4,0x4a,0x89,0x72,0xa2,0xb5,0x09,0xd9,0x2e,0x2e,0x99,0xc6,0xba,0xa4,0x84,0xb8,0xb8,0xb4,0xea,0x48,0x5c,0xe2,0x21,0x2b,0xc3,0x3d,0x09,0x3c

of course it’s not great…

They should sound something like (rate manually adjusted on “error in” and “not found”)):

It’s a bit better than before but it’s not good. They are both too fast.

version sounds like “mmzen”
voice pack sounds like “voza”

It was not just me, my son had a listen too.

At least that’s what is sounded like from my board connected to probably a cheap-ish Chinese speaker.

I don’t think you understand how difficult it is to make them LOL.
But it played right? Can you post audio like you did before?

Seems fine.

From experience, only a very small handful of people know what these are saying on first listen.

Usually they get it wrong, often misinterpreted entirely, so talkie is only a step or two more “intuitive” than beeps. (Have to look it up anyways)

Being legible isn’t the precedent, in shorter terms.

All the changes for KEEP_MINIMUM_TALKIE_ONLY can be found here:

Also included are:

  • code for new error “voice_pack_not_found”
  • code for new error “error_in_voice_pack_version”
  • lots of tabs clean-up
  • some slashes line up
  • some typo in comment
  • end of line empty spaces clean-up
  • maybe a few more “cosmetic” changes that I can’t remember

I still need to add:

  • beepers codes for “voice_pack” & “version”
  • better (if possible) talkie codes for “voice_pack” & “version”

I have no idea how hard or not it is. I would personally prefer to have a .wav with Din Djarin’s voice (and/or Rex), :wink: (whish-full thinking) :crossed_fingers:t2: for all the errors:

EFFECT(erbladar); // for "error in blade array"
EFFECT(erfntdnf); // for "font directory not found"
EFFECT(erinftdr); // for "error in font directory"
EFFECT(ervpntfd); // for "voice pack not found"
EFFECT(erinvpvr); // for "error in voice pack version"

// maybe even
EFFECT(lowbatt);  // for "battery low"

But I already found a pretty cool one for that error, I think from @Sabersense saying “twit, twit, twit, battery level critical”

Yes it did. I played it again with:

  • talkie15 ← same “bad” as before
  • talkie ← worse
  • talkie_slow and placing the speaker 1cm from my good ear, it’s better for “version” but voice_pack sounds like “mwa-mwaa”

Do you know how hard that is! :rofl: Not hard at all, but be aware that I am very slow with having to do several audio recordings, because sounds “making stuff” is not my thing. Because doing for each of them one by one:

  • playing them from serial monitor to my saber and recording them on my Iphone at the same time
  • naming them
  • emailing them to my laptop
  • saving them on my laptop
  • opening them in Audacity
  • removing the before and after “silence”
  • converting them to a "*.wav" 44100Hz mono 16 bits from a "*.m4a" so they could at least be used on a Proffie SD-card because “why not”
  • finally posting them here

That takes a lot of time! I don’t mind though because I have a lot of time.
Maybe there is a better way than my “self-invented” method ?
Anyway, here they are:

Playing them with talkie15: (I did get “Whut? :talkie15” but it played)

Playing them with talkie_slow: (I did get “Whut? :talkie_slow” but it played)

Now lets compare them to “my take” on talkie:

Granted, I would rather have my “font” talkie say “FONT” rather than “F”.“O”.“N”.“T” but I’ll take “F”.“O”.“N”.“T” over talkie_font_directory_15 anytime.

Unfortunately creating “good” talkies is a lost art.
There are programs that can encode recorded sound into talkie format, but the result is often absolute crap unfortunately.