Files
ds_fire_fighter/audio_experiment.ipynb
T
2024-08-09 15:41:38 +01:00

289 lines
30 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n",
"Collecting pydub\n",
" Downloading pydub-0.25.1-py2.py3-none-any.whl.metadata (1.4 kB)\n",
"Downloading pydub-0.25.1-py2.py3-none-any.whl (32 kB)\n",
"Installing collected packages: pydub\n",
"Successfully installed pydub-0.25.1\n"
]
}
],
"source": [
"# !pip install groq\n",
"# !pip install pydub "
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"from groq import Groq\n",
"import os\n",
"import re\n",
"import shutil\n",
"import numpy as np\n",
"from pydub import AudioSegment\n",
"from langchain_core.documents import Document"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"client = Groq(api_key = os.getenv('GROQ_API_KEY'))\n",
"model = 'whisper-large-v3'"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Audio to Text\n",
"def audio_to_text(filepath):\n",
" with open(filepath, \"rb\") as file:\n",
" translation = client.audio.translations.create(\n",
" file=(filepath, file.read()),\n",
" model=\"whisper-large-v3\",\n",
" )\n",
" return translation.text"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# testing the function\n",
"path = \"data/test_rec.m4a\"\n",
"transcript = audio_to_text(path)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" hello everyone so i'm timothy i'm doing this recording to talk about something i need about cars okay let's say very correct okay so what is a car the guy is a mechanical object designed to transport people from one location to the other so that's like how i would define a car for you right okay so what do i need about a car how do i fix something I kind of know little and that little is a much on its own right I have very good understanding of like service is very cool, a car, you know changing the oil, removing the oil filter, changing the oil filter like that like that right so I think um yeah yeah yeah yeah so what else you don't see what else should I say? alright this is good it's good enough yeah thanks bye stop\n"
]
}
],
"source": [
"print(transcript)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"def split_audio_by_duration(audio_file_path, chunk_duration_minutes, print_output=True):\n",
" # Convert chunk duration to milliseconds\n",
" chunk_length_ms = chunk_duration_minutes * 60 * 1000\n",
"\n",
" # Load audio file\n",
" audio = AudioSegment.from_file(audio_file_path)\n",
" audio_duration_ms = len(audio)\n",
"\n",
" # Create a temporary directory for storing chunks\n",
" base_filename = os.path.basename(audio_file_path).split('.')[0]\n",
" chunk_folder = f\"{base_filename}_chunks\"\n",
" if not os.path.exists(chunk_folder):\n",
" os.makedirs(chunk_folder)\n",
"\n",
" chunk_paths = []\n",
"\n",
" if audio_duration_ms > chunk_length_ms:\n",
" # Calculate the number of chunks\n",
" num_chunks = audio_duration_ms // chunk_length_ms + (1 if audio_duration_ms % chunk_length_ms != 0 else 0)\n",
"\n",
" for i in range(num_chunks):\n",
" start_ms = i * chunk_length_ms\n",
" end_ms = min(start_ms + chunk_length_ms, audio_duration_ms)\n",
" chunk = audio[start_ms:end_ms]\n",
" chunk_filename = f\"{chunk_folder}/{base_filename}_chunk{i+1}.mp3\"\n",
" chunk.export(chunk_filename, format=\"mp3\")\n",
" chunk_paths.append(chunk_filename)\n",
" if print_output:\n",
" print(f'Exporting {chunk_filename}')\n",
" else:\n",
" # If audio duration is less than the chunk duration, store the whole file as a single chunk\n",
" chunk_filename = f\"{chunk_folder}/{base_filename}_chunk1.mp3\"\n",
" audio.export(chunk_filename, format=\"mp3\")\n",
" chunk_paths.append(chunk_filename)\n",
" if print_output:\n",
" print(f'Exporting {chunk_filename}')\n",
"\n",
" return chunk_folder, chunk_paths\n",
"\n",
"def transcribe_audio_chunks(audio_file_path, chunk_duration_minutes):\n",
" # Split the audio file into chunks\n",
" chunk_folder, chunk_paths = split_audio_by_duration(audio_file_path, chunk_duration_minutes)\n",
"\n",
" documents = []\n",
" for chunk_path in chunk_paths:\n",
" # Transcribe the chunk\n",
" transcript = audio_to_text(chunk_path) # Assuming this function exists\n",
"\n",
" # Extract the base filename and chunk index using regex\n",
" chunk_filename = os.path.basename(chunk_path)\n",
" match = re.search(r'(.*)_chunk(\\d+)\\.mp3$', chunk_filename)\n",
" if match:\n",
" base_filename = match.group(1)\n",
" chunk_index = int(match.group(2))\n",
" else:\n",
" # Default values in case of unexpected filename format\n",
" base_filename = os.path.splitext(chunk_filename)[0]\n",
" chunk_index = 1 # Assuming it's the first chunk\n",
"\n",
" # Calculate the chunk's start and end times in minutes\n",
" start_min = (chunk_index - 1) * chunk_duration_minutes\n",
" end_min = chunk_index * chunk_duration_minutes\n",
" actual_end_min = min(end_min, (len(AudioSegment.from_file(audio_file_path)) // 60000)) # To handle the last chunk's actual duration\n",
"\n",
" # Create a document with the transcript and metadata\n",
" metadata = {\n",
" \"filename\": base_filename,\n",
" \"duration\": f\"{start_min}-{end_min} minutes\"\n",
" }\n",
" document = Document(page_content=transcript, metadata=metadata)\n",
" documents.append(document)\n",
"\n",
" # Delete the chunk folder after processing\n",
" shutil.rmtree(chunk_folder)\n",
"\n",
" return documents\n"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Exporting audio-2_chunks/audio-2_chunk1.mp3\n",
"Exporting audio-2_chunks/audio-2_chunk2.mp3\n",
"Exporting audio-2_chunks/audio-2_chunk3.mp3\n",
"Exporting audio-2_chunks/audio-2_chunk4.mp3\n",
"Exporting audio-2_chunks/audio-2_chunk5.mp3\n",
"Exporting audio-2_chunks/audio-2_chunk6.mp3\n",
"Exporting audio-2_chunks/audio-2_chunk7.mp3\n"
]
}
],
"source": [
"# Example usage\n",
"audio_file_path = \"data/audio-2.mp3\" # Replace with your audio file path\n",
"chunk_duration_minutes = 3 # Replace with your desired chunk duration in minutes\n",
"documents = transcribe_audio_chunks(audio_file_path, chunk_duration_minutes)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Document metadata: {'filename': 'audio-2', 'duration': '0-3 minutes'}\n",
"Transcript: Hey guys, ChrisFix here and today I'm going to show you how to change the oil in your car or truck. This video is specifically geared to beginners who have never done an oil change. So this is going to be an in-depth video and after watching it you'll be able to change your own oil. Many inexpensive oil change shops will use cheap oil and really cheap filters. So by doing an oil change yourself you could use good motor oil, a good filter, and know the job is getting done right. Plus you get to save some money and it's fun to work on your own car. If you've ever done oil changes before and want to share your tips, leave a comment. Now let's take a look at the tools you need to change your oil. So here's everything you're going to need to change your oil. You can see we're just using common hand tools. We have a socket set that has a ratchet and some sockets. Gloves so you don't get the oil on your skin because oil is not good for you. Paper towels to clean up. We have our oil and filter and I'll explain in a second how to find the correct oil and the correct filter for your car. We have an oil filter wrench, you might need it or you might not but it's worth to have just in case. We have an oil catch pan so you can recycle your old oil and a funnel so you can fill up your engine with new oil. I'm also including a breaker bar just in case your drain bolt is hard to get off. This will make it really easy. In addition to tools to change the oil, you're also going to need something to jack your vehicle up. In this case we have ramps or you could use jack and jack stands and then a piece of wood to block off the rear tires and I'll show you everything. There's also another method you could use where you don need any of this You could just drive your vehicle up onto the curb to get enough access to safely get underneath and drain the oil So you can use whatever method works for you I just want to note also that any tools that I using here including the jacks jack stands ramps and even the oil check the description. I'll link everything. So if you don't have something, you could easily find it and you could easily see what I used. And as always, if you have any questions throughout this process, leave a comment below and I answer every question and comment. So by the end of this video, you'll be an oil change expert. So let's go take a trip to the store and let me show you how to find out what oil your car takes. To figure out what oil your car takes, you can look in the owner's manual. So just go grab your owner's manual. We're going to flip to the back here. You can look under oil and capacities. You can see it tells you how much oil you're going to need. So we're going to need 4 14 quarts. And then you want to check the viscosity of the oil that you need. and we're going to need 4 14 quarts of 0W-20. So let's go to the store and we'll check that out right now. Alright, we're in the store and we need to find a synthetic 0W-20 oil. There's a ton of oil to choose from. Here is 0W-20. You can see, here's where the viscosities are listed. 0W-20 is right here. Here's 10W-30. So make sure you get the correct viscosity. Here's the 0W-20 we need. We want a full synthetic. We need at least 4 quarts and this container has 5, so that's plenty. If you have an older car, you might not need synthetic, but I personally like running synthetic oil even in my older cars. There are a lot of myths out there on switching to synthetic, and just to be clear, I don't think there's a lot of myths out there on switching to synthetic. I think it's a good idea to switch to synthetic oil. I think it's a good idea to switch to synthetic oil.\n",
"Document metadata: {'filename': 'audio-2', 'duration': '3-6 minutes'}\n",
"Transcript: so that you know you could switch to synthetic and you could switch back to conventional at any time. Conventional is cheaper, but on most new cars, you need to run synthetic. Plus, synthetic oil lasts longer. Speaking of how long oil lasts, change your oil at the recommended mileage that's listed in the owner's manual. Many cars have an oil life monitor that'll tell you when you need to change your oil, so just go by that. If you can't find any information on when you need to change your oil, I change the oil in my cars at around 5,000 miles. My van has over 300,000 miles, and we've had that car since new, and she's still running great. Okay, so we have our oil. Now let's go find the filter. There are tons of oil filters, but which one do you pick? Well, just look in the book here, and we're doing the oil change on a 2014 Nissan Sentra. Personally, I like using pyrolator filters, but any quality filter will do. We need an L14612. Okay, L14612, L14612, right here. Good. So there we go. We got the oil and the filter. I'm going to go check out real quick, and let's go change the oil. All right, so now that we got our correct viscosity oil, 0W20, and we have the correct oil filter, let's get underneath this car. And I'm going to show you how to jack the car up first, and then I'm going to use the because that what I prefer So an oil change has three basic parts One you got to drain the oil Two you have to change the oil filter And three you have to fill it with the correct new oil Let go step by step so you know exactly what you need to do The first step is to drain the oil. And to get to the oil drain plug, we have to go underneath the vehicle. So we're going to have to lift the vehicle up. To jack the car up, if you're not completely sure how to do it, you could check the owner's manual. It tells you exactly how to jack the car up to change a spare tire. But I'm going to show you right here what you need to do. And you want to make sure before where you jack the vehicle up, you block off the rear tire so the car doesn't roll. The other thing you want to do is if you have an automatic, make sure it's in park. If you have a manual, put it in first gear and also pull the emergency brake which will prevent the car from rolling. So get your jack and place it underneath the vehicle right where your jacking points are. In this case, the jacking points have these little indents in them. That area of the frame is meant to support the vehicle and then you can jack the car up. Once the car is jacked up you can get your jack stands and place it under the car right where there's a big piece of metal on the frame and then you're going to lower the car down onto the jack stands and then you have plenty of room to get to the oil pan. So we'll just let the car down slowly and you can see the jack stand is the only thing holding it up and once your car is safely supported on the jack stands I always like I like to put the jack right back on the frame just for extra support. So if for some reason the jack stand slips or something or malfunctions, you have backup with the jack.\n",
"Document metadata: {'filename': 'audio-2', 'duration': '6-9 minutes'}\n",
"Transcript: Never be too safe. So that's how you jack your car up to do an oil change. I want to show you the method that I prefer. It's a lot easier, a lot safer, and that's using ramps. Make sure you always use jack stands and not just the jack. You don't want to just rely on the jack to protect you from the car falling on you. Like you saw, I like to use both. Double the protection. Now using ramps is my favorite method. It's the easiest, it's the safest, and it also raises the vehicle pretty high. All you have to do is park the vehicle in a spot where you can slide two ramps right under the wheels and then you just drive the car up the ramps. It's that simple. Make sure that you pull the emergency brake again and we're blocking off the rear tires again. And I think you can get why I like the ramps so much. Before you go under the car, even when you have the car jacked up, what you want to do is you want to just shake the car with your hand. The car should not move anywhere. You're just shaking it back and forth as hard as you can and it should be stable and this thing is stable. Once you know that the vehicle is safe to go under, you can see why I like using the ramps. Look at all this room that we have now. Alright so now let's go under the car and find the oil drain plug. So you can see my feet over there. This is the front of the car right here. And then we're looking up here. And if we look here you can see there's a bunch of stuff and you might be confused, oh where's the bolt that I need to undo? Where's the oil drain bolt? Well what you want to do is you want to locate the drain pan The drain pan is this right here It usually black and has a bolt coming out You can see the bolt right back here That your oil drain pan Now there's other things that look like it, but this should be pretty easy to find because you're looking for that bolt and you're looking for the black pan. But you could also see right here is another drain pan. But this drain pan here doesn't have any bolts to let fluid out. This is the transmission drain pan. So really simple to find the oil drain pan. And then actually you can see right behind the drain pan you want to locate your oil filter. In this case, oil drain pan here, oil filter is right behind it and it's up and down nice and easy to get to which is really good. In some vehicles, the oil filter is actually on top of the engine. For example, in this Toyota Tacoma you can see here. In this case though, it's underneath, it's pretty easy to get to. This is really easy to get to also. You can see the drain plug right there. Let's go get it off. Now before we remove the drain plug, get your oil collection pan, slide it under. Now we have a sideways view, you can see our filters right here, our oil drain pan is right here and our oil drain plug is right there. We have our oil catch can right here, it's kind of aimed behind a little bit because the oil is going to come out that way. In this case we're using a 14mm socket on our ratchet and to loosen you want to go this way counterclockwise righty-tighty lefty-loosey. So this might be a problem some of you might encounter where you're using your normal size ratchet it's hard to get\n",
"Document metadata: {'filename': 'audio-2', 'duration': '9-12 minutes'}\n",
"Transcript: That drain plug out. Well don't be discouraged. There's an easy trick to use. And that trick is to use one of these long breaker bars. You can see here how much longer it is than my ratchet. And this is going to give you so much leverage that it's going to be really easy to get off. If you don't have a long breaker bar like this, you can get your ratchet and slip a pipe over the end to make it longer. Watch how easy this is going to be now. Boom, it's loosened. That's all it took. all it took. So now we can loosen this the rest of the way. Once it gets really loose, make sure your drain pan is ready to go. And you can loosen this by hand. Now you can wait for all the oil to drain out. Now I should mention, some people say you should change your oil after you run the car for like 10 minutes so the oil is warm and it flows easier. In reality, it doesn't matter. If you want to change your oil with the car sitting there, you just jack it up and the car is cold, all that oil is going to be in the oil pan. You're not going to risk burning yourself, and sometimes it just makes the job easier. Now if you're going to put your car up on the ramps, then you're starting your car anyway. Just make sure if you run your engine, you let it sit for like five to 10 minutes. Let it cool off a little bit so you don't burn yourself, and also so all the oil collects in the drain pan. On some oil drain plugs, there's a gasket to help seal the plug, and you can see here there's a copper crush gasket. These gaskets are generally one use so take off the old gasket and replace it with a new one Some people reuse these gaskets one or two times and never have a problem with leaks and I one of those people but in general I suggest you replace the gasket. Alright, the oil is completely drained. There are a few drops coming out, so let's screw in the drain plug and move on to the next step. Just screw it in by hand and it should tighten right up. I like to wipe away any extra oil before I tighten it down all the way so your drain pan stays clean and so you know if there's any oil leaking from the drain plug down the road. Now we want to tighten up our drain plug and to do that we want to go clockwise. So we're going to switch this so now we're going to tighten this clockwise and notice I'm using our ratchet and not our breaker bar. You want to use the small ratchet to tighten this. You're only tightening it so it's snug you don't want to over tighten it. You over tighten it you'll strip the drain plug and you'll cause way more problems. You have a washer on there. All you need to do is tighten it down to 20 foot pounds of torque, which is nothing. So use the small ratchet. Tighten it, and once it's snug, give it a little extra turn. And that's it. So we just finished step one, removing all the old oil. Now step two is changing the old oil filter. Okay, so we should be be able to get this off by hand. Nope, too tight. So if your oil filter is tight and it won't come off, we have four different style tools that you can use to get your oil filter off. This one's my favorite because it works for all different sizes.\n",
"Document metadata: {'filename': 'audio-2', 'duration': '12-15 minutes'}\n",
"Transcript: It's literally just a wrench and it grabs on and then you can turn it. This one, put it in here and then as you turn, you can see it gets smaller. But you can see this is a really small filter. This is for actually a big 454 cubic inch engine. So the oil filter on that is huge. Here's another adjustable one. It's rubber so it grabs on really tight. Just close it by pulling the rubber through here. and then when you turn to loosen, you turn like this, and it kind of grips because it's turning on here and grabbing it. These are good because they're adjustable, and they work on all different sizes. And the last style is this style, but you need it for each specific size that you use. But this is a really small filter, so you can see it won't work. But the idea is it's just like a giant socket for a filter. And then you can put your wrench right in here, just like that, and then boom. comes right off. But we're going to be using this because it's easy to use, quick, grabs on all different size filters. So let's get this filter off. Okay. You can see that does the trick. We can unscrew this the rest the way by hand. Make sure your oil catch can is right below where this is because this is going to leak oil. As you can see There we go Just put that right in there Alright so with our old filter out we want to grab our new filter And I like to pre-oil my filter. It prevents the car from running dry when you first start it up. So if you just put this filter in now and screw it in, there's no oil in here. So the oil has to fill this and then go to all the engine parts. But if we fill this first with our brand new oil, then we don't have to worry about the engine running dry and this is just going to give you a longer lasting engine. I should also mention that not every car you're going to be able to pre-fill these because some cars it's upside down or some cars it's in sideways. We just want to carefully fill this filter to the top just like that. Now what you want to do is you want to get oil around this gasket. You can see a little bit of oil got on the gasket just by chance but you want to make Make sure you have a clean finger. Just get a little bit of oil and just put it right around this gasket. And what that's going to do is it's going to make it easier to come off next time you do this and it's also going to prevent leaks. And that's all you need to do. Now let's go install it. So there's the drain pin. We go up and you look here and that's what the oil filter adapter looks like. And if we look there you can see the oil filter screws right onto that middle stud there. So it screws in right there. And you just try to make it flush as you turn it. So if it's flat as you turn it, it's going to be a little bit more stable.\n",
"Document metadata: {'filename': 'audio-2', 'duration': '15-18 minutes'}\n",
"Transcript: should grab and you'll know when it grabs you'll feel it. Don't force it, it should go on really easily. You can see there, it's on. So now I just tighten it by hand. Don't use any tools to tighten these, just tighten it by hand. If your hands are slippery because it's oily, you grab a towel, clean it off and then turn it more by hand with the towel. Good. So step one is done. Step two, changing the oil filter is done. Now let's get the car on the ground and do step three which is adding new oil. So we're going to add the oil to the engine while we're on the ramps just so that we make sure that we don't start the engine with no oil in it. And when you're looking for where you add your oil, it's usually at the top of the engine. Here's where you check your oil. You can see it says engine oil on here. And that's not where you fill it. Where you fill it is right up here. It has the oil sign. It's upside down but it has the oil sign on here. And this is all dirty so you don't want to just take this cap off you want to clean the area first because you don't want that junk falling into the engine so just get your paper towel get in here and clean it good now that that's clean we can take this cap off and we'll place our funnel right in here so we could fill the engine up with brand new oil so on the side of our bottle we have a scale here that tells you how many quarts or liters you have and you want to do this on a level surface but you can see we pretty much full right now and we need to add four quarts It was four and a quarter quarts with the filter but we added the oil to the filter so it really just four quarts So we want to have a quart left which is right down here. I always have a towel ready just in case. I hate spilling oil on engine parts. Just a little top tip. If you pour it sideways like this, you actually have a little more control, surprisingly. And usually the oil doesn't come out in blobs. It comes out nice and smooth instead. So if we look here we have about a half a quart we need to add. And it looks like we're at about one quart so I'm going to stop there. Close that up. So we just finished the last step which is add oil. We have one more step to do and And that is to get the car off the jack stands, or in this case the ramp, on level ground and check the oil. Since we added oil, we can start the car. And you just want to make sure that there's no oil lights on. And you can see the oil light isn't on, so that means the engine's getting oil. Now we can back the car down. And now that we have the car back down on level ground, let's go check the oil. So shut the engine off. You want to let the engine sit for about 5 minutes so all the oil drops back down since we did start the engine.\n",
"Document metadata: {'filename': 'audio-2', 'duration': '18-21 minutes'}\n",
"Transcript: After you let it sit for five minutes, get a towel, pull your dipstick out and clean it off. Put it back in. Make sure it's pushed down all the way. And then pull the dipstick back out. Okay, if we look at the dipstick, what you're looking for is the oil. You can see the oil's over here. There's low and there's high. So that dot right there means that the oil is low and you need to fill it up. That dot right there means the oil is high and it means that you have it completely full. Anywhere in between is good. I prefer trying to get it to the high. Now sometimes it's hard to see how much oil is on here, especially this brand new oil and especially this synthetic oil. So if you flip this over, you actually get a better look and you can see the oil goes right there. So we're right on the high, which is perfect. So we don't have to add oil or anything. If yours is too low, add a little bit of oil and check the level again. If you end up adding a little bit too much oil, that's not a big deal. If you add over a quart of extra oil, then you have a problem and you probably have to remove some of it because that could actually cause engine problems And that is the complete guide to changing oil in your car or truck Hopefully after this video you have no questions but if you do have questions just comment below I answer every comment and question Also if you end up doing your first oil change after watching this video, definitely let me know because I love to hear that stuff. Hopefully this video was helpful. If it was, remember to give it a thumbs up. Up on the screen are going to be other videos. You can find the links to those videos as well as any links to any tools that I used in this video in the description. The top tip for this video is, well, where do I put all my oil that I drained out from my filter and from the car? And the answer to that is you want to dispose all of your oil responsibly. You can see here in the corner of my garage I have all these old oil containers. I really need to make an oil run. But what you do is you just fill up a container. It could be an old oil container, it could be a milk container, orange juice, whatever you have. And what you do is you just fill up these containers and you go to your local auto parts store, your local garage, your local recycle center, places that sell the oil like Walmart, most of those places will take the oil and they'll take it for free so that they could recycle it so it doesn't become an environmental hazard.\n"
]
}
],
"source": [
"\n",
"# Output the documents for verification\n",
"for doc in documents:\n",
" print(f\"Document metadata: {doc.metadata}\")\n",
" print(f\"Transcript: {doc.page_content}\") # Print first 100 characters of the transcript"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'filename': 'audio-1', 'duration': '3-6 minutes'}"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"documents[1].metadata"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "smog_env",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.9"
}
},
"nbformat": 4,
"nbformat_minor": 2
}